Skip to content
jesusprodriguez.com

azure-pr-review

Azure Repos: revisar una pull request

Review a pull request against risk criteria —correctness, contract, security— and leave every comment anchored to the right line.

stack:
Azure DevOps
task:
Review
version:
v1.0.0
updated:
size:
4.5 KB
read:
3 min
license:
CC-BY-4.0

When it fires

When reviewing a specific PR or forming the verdict before approving.

description: Revisa una pull request de Azure Repos de principio a fin - trae el diff, lo analiza por criterios de riesgo y deja comentarios inline en el hilo correcto. Úsala cuando te pidan revisar una PR concreta o preparar el comentario de revisión antes de aprobar.

  • Diff from refs/pull
  • Risk checklist
  • Inline threads over REST
  • Blocker vs suggestion

How you ask for it

> Review PR 4821 in the Expedientes repo and leave the comments anchored to the right thread.

Say this to the agent as it is: the skill loads itself from its description, you do not have to name it.

Requires azure-devops-cli Install these too: this skill assumes the access they set up.

How to install one

/plugin marketplace add https://jesusprodriguez.com/skills/marketplace.json
/plugin install azure-devops@jprodriguez-toolkit

The native route, and the only one that updates itself: add the marketplace once and `/plugin marketplace update` brings in new versions. Skills get their own namespace (`azure-devops:azure-pr-review`).

The whole file

This is exactly what you download: no summaries, nothing trimmed.

Heads-up: the skill file itself is written in Spanish. Agents read it fine and answer in your language, but the prose below is not translated.

Azure Repos: revisar una pull request

Revisar no es leer el diff de arriba abajo. Es buscar lo que rompe en producción y decirlo donde el autor pueda actuar.

1. Traer el contexto

az repos pr show --id <PR> --output json

De ahí salen sourceRefName, targetRefName, repository.id y los workItemRefs (el PBI que justifica el cambio: si no hay ninguno, ya tienes el primer comentario).

El diff se lee mejor en local. Azure Repos publica la rama de la PR en refs/pull/<id>/merge:

git fetch origin refs/pull/<PR>/merge
git diff origin/<rama-destino>...FETCH_HEAD
git diff --stat origin/<rama-destino>...FETCH_HEAD   # empieza por aquí

Lee el --stat primero. Decide dónde mirar antes de mirar: 40 ficheros cambiados con 38 de traducciones y 2 de lógica son una PR de 2 ficheros.

2. Qué se busca, en este orden

Correctitud — lo único que justifica bloquear una PR:

  • Condiciones de contorno: colección vacía, null, valor límite, primera ejecución, reintento.
  • async sin await, .Result o .Wait() (deadlock esperando su turno), CancellationToken que se pierde por el camino.
  • Concurrencia: estado compartido mutable, dos peticiones a la vez sobre la misma fila sin control de concurrencia optimista.
  • Transacciones: ¿qué queda a medias si el paso 3 de 5 lanza excepción?
  • Consultas EF Core nuevas: N+1, AsNoTracking() ausente, filtro que se evalúa en cliente.

Contrato y compatibilidad — lo que rompe a otros:

  • Cambio en una respuesta pública de API: ¿campo eliminado o renombrado?
  • Migración de base de datos: ¿es reversible? ¿bloquea la tabla? ¿el despliegue admite versión antigua y nueva a la vez?
  • Configuración nueva sin valor por defecto → el entorno que no la tenga arranca y falla en la primera petición.

Seguridad:

  • Secretos, cadenas de conexión o tokens en el diff. Si aparece uno, el comentario no es “quítalo”: es “rótalo, ya está en el historial”.
  • Entrada del usuario que llega a SQL, a una ruta de fichero o a la respuesta HTML sin escapar.
  • Endpoint nuevo sin RequireAuthorization() o sin comprobar que el recurso pertenece a quien lo pide.

Pruebas:

  • El caso que motiva la PR, ¿está cubierto por un test que falle sin el arreglo? Si el bug puede volver sin que nadie se entere, la PR no está terminada.

Y después, lo demás: nombres, duplicación, complejidad. Sugerencias, no bloqueos.

3. Comentar donde toca

La CLI no crea hilos de comentarios; es REST. Un hilo anclado a una línea:

az devops invoke \
  --area git --resource pullRequestThreads \
  --route-parameters project=$PROJECT repositoryId=$REPO pullRequestId=$PR \
  --api-version 7.1 --http-method POST --in-file hilo.json
{
  "comments": [{
    "parentCommentId": 0,
    "content": "`items` puede venir vacío y `First()` lanza. ¿`FirstOrDefault()` y salida temprana?",
    "commentType": "text"
  }],
  "status": "active",
  "threadContext": {
    "filePath": "/src/Application/Orders/OrderService.cs",
    "rightFileStart": { "line": 42, "offset": 1 },
    "rightFileEnd":   { "line": 42, "offset": 30 }
  }
}
  • filePath empieza por / y es relativo a la raíz del repo.
  • rightFile* para líneas añadidas, leftFile* para las eliminadas.
  • status: "active" abre el hilo (visible como pendiente); "closed" lo deja como comentario informativo que no estorba.

4. El comentario de cierre

Un resumen en el hilo general con el veredicto, sin ambigüedad:

Revisado. 2 bloqueantes (#42 vacío, migración no reversible),
3 sugerencias. El resto, bien: la separación de OrderService quedó limpia.

Reglas de tono

  • Comenta el código, nunca a la persona: “esto se rompe si X”, no “no has tenido en cuenta X”.
  • Distingue explícitamente bloqueante de sugerencia. Un revisor que no prioriza obliga al autor a adivinar.
  • Si el diff es correcto, dilo y aprueba. Inventar pegas para justificar la revisión es la forma más rápida de que dejen de pedírtelas.
  • Nunca apruebes ni votes en nombre de otra persona: el veredicto se propone, lo firma quien revisa.