Tornar al Blog

La teva documentació et menteix. I les teves validacions, també

Aquest estiu vaig obrir un document nostre que descrivia, amb tot luxe de detall, una infraestructura que feia mesos que estava apagada. Adreces, diagrames, quin servei parlava amb quin. No estava mal escrit: estava perfectament escrit. L'única cosa que li passava és que ja no era veritat, i res al document ho deia.

El vam trobar perquè estàvem passant la documentació d'un client a un sistema nou. I aquest és el punt: no el va trobar ningú llegint. Feia mesos que hi era, disponible perquè algú prengués una decisió amb tota la confiança del món.

La documentació no envelleix: caduca

Un text que envelleix es nota. Un que caduca, no. I la raó de fons és que el format en què escrivim no té manera d'expressar la diferència entre tres coses que no s'assemblen gens: això ho he comprovat, això es comprova així i això me l'imagino.

Al cap de sis mesos les tres es llegeixen igual. Aquí és on es prenen les decisions dolentes, i no per descuit: per confiança mal calibrada.

Tres estats que no es barregen

L'eina que hem construït obliga cada afirmació a declarar com se sosté. Mesurat: algú va executar l'ordre i la sortida està desada. Comprovable: no està capturat, però hi tens l'ordre per veure-ho en un minut. Hipòtesi: es creu, no s'ha provat, i ho diu.

Tres, no quatre. Afegir un estat més és exactament com es torna al punt de partida, on tot es llegeix igual.

Allò que deixa de ser veritat no s'esborra

Quan alguna cosa canvia, la informació nova supersedeix la vella i la vella es queda. Sembla contraintuïtiu, però saber per què crèiem allò anterior sol ser just el que necessites quan estàs diagnosticant. Esborrar-ho llença aquesta pista i no deixa rastre que algú s'ho va creure.

La tercera resposta

Les sondes de frescor tornen a executar allò que es va capturar i responen tres coses: igual, ha canviat o no s'ha pogut comprovar. Aquesta tercera és la que més ens ha servit. Una eina que converteix un timeout de xarxa en un «tot correcte» és pitjor que no tenir eina: fabrica confiança a partir d'una fallada de connexió.

Preguntar a un altre model, i dir-ne opinió

Una de les sondes fa una cosa diferent: ensenya l'afirmació a un altre model i li pregunta si continua sent certa. No li explica com hi vam arribar, i això és deliberat. Si li dones el teu raonament, tendeix a donar-te la raó, i llavors la comprovació deixa de ser independent sense deixar de semblar-ho, que és la pitjor combinació possible.

La resposta d'un model és una opinió, no una mesura. Que un altre model discrepi és un motiu per anar a mirar, no una prova que estiguis equivocat. Per això aquesta sonda mai pot ascendir res a «mesurat»: si és l'única cosa que tens, l'estat honest continua sent «hipòtesi».

El mateix principi, aplicat a la feina

Si exigeixes evidència a la documentació, és estrany no exigir-n'hi al que hi fas. Així que el repositori no és només la capa de coneixement: són 44 skills i vuit agents amb el mateix criteri al darrere — una comprovació que no pot fallar no és una comprovació.

Estan agrupades per la frase que diries en veu alta, no per categoria. Vint-i-una són nostres i cadascuna porta al darrere un incident que va costar temps real; les altres vint-i-tres vénen adaptades d'un treball excel·lent de Matt Pocock, amb la seva llicència MIT i el seu copyright intactes.

Abans de tocar res

6
route-work-to-the-right-model write-the-rollback-plan-first deploy-to-production-safely edit-a-live-config-safely check-if-data-is-safe-to-delete block-dangerous-git-commands

Alguna cosa està trencada

4
diagnose-a-hard-bug root-cause-analysis-first debug-a-silent-failure triage-issues-and-prs

Abans de dir que funciona

3
verify-before-saying-done validate-your-validator get-a-second-model-opinion

Escrivint codi

5
tdd implement-from-a-spec build-a-throwaway-prototype resolve-merge-conflicts set-up-pre-commit-hooks

Dissenyant

6
design-deep-modules build-a-domain-model find-architecture-improvements stress-test-a-plan-with-docs stress-test-a-decision turn-a-decision-into-a-questionnaire

Planificant

4
write-a-spec-from-a-conversation break-work-into-tickets plan-work-too-big-for-one-session set-up-the-issue-tracker

Revisant

2
review-changes-against-spec-and-standards choose-the-right-code-review

Un sistema que no vas construir tu

3
investigate-an-unfamiliar-system map-an-undocumented-system research-with-primary-sources

Deixant-ho per escrit

11
set-up-verified-documentation document-with-evidence supersede-outdated-docs detect-stale-documentation keep-agent-memory-accurate write-docs-people-can-find write-docs-for-agents write-a-handover-that-works teach-a-concept generate-a-setup-wizard pick-the-right-skill

Vuit agents, i cap no es valida a si mateix

Hi ha un agent per tipus de feina, cadascun amb la seva llista de comprovacions. El que implementa no valida el que ha fet. El de proves no mira si passen, mira si demostren res. El de front no revisa CSS: revisa la pàgina renderitzada, amb captura. I hi ha un advocat del diable la feina del qual és tombar el canvi; aprovar-lo no entra a la seva descripció.

Cada agent declara a més amb quin model corre, perquè la major part d'una revisió no necessita el model més gran. La regla que ho ordena és d'una línia: estalviar on equivocar-se és barat, mai on és car.

programmer sonnet Implementa. No valida el que fa.
tests sonnet No mira si passen: mira si demostren res
infra-reviewer sonnet Contenidors, orquestrador, fitxers compartits, xarxa
frontend-reviewer haiku Mai revisa CSS: revisa la pàgina renderitzada, amb captura
documenter haiku Escriu el símptoma primer, que és per on es busca
security-reviewer opus Exposició, secrets, permisos, traçabilitat
data-reviewer opus Migracions, esborrats, i tot allò que toca diners
devils-advocate opus Intenta tombar el canvi. Aprovar no és la seva feina

D'aquí surt l'única regla dura del repartiment: res del que és al nivell més alt no corre amb el model petit.

I que ho decideixi una ordre, no tu a les onze de la nit

Decidir quanta validació mereix cada canvi, canvi a canvi i en calent, és exactament com s'acaba no validant res: la decisió la pren sempre qui més vol que la resposta sigui «poca». Així que la pren una ordre, contra una taula escrita quan no hi havia res cremant.

$ validated-memory route "small tweak to the checkout flow" \
      --path src/billing/refund.py

Level 3 — 3 validations

  matched money: billing, checkout, refund
  matched touched path: billing

  model   : opus
  effort  : high
  agents  : security-reviewer, data-reviewer, devils-advocate

«Small tweak» descriu una intenció. Les paraules i les rutes descriuen un risc, i només una de les dues coses vota.

L'important és què fa quan no reconeix res: no cau al nivell més barat. Un canvi que no sap llegir es tracta com a producció, i ho diu en veu alta en comptes de disfressar la suposició de lectura. Equivocar-se cap amunt costa una revisió que no calia; cap avall costa un incident. No són simètrics, així que el valor per defecte tampoc.

Quantes validacions necessita un canvi

Això no es discuteix canvi a canvi, perquè discutir-ho és exactament com s'acaba no validant res. Està decidit per endavant i surt del tipus de feina:

1
Cosmètic, documentació, allò que no arriba a producció
1 revisió
2
Codi en producció, configuració de servei, CI, dependències
2 independents
3
Autenticació, permisos, diners, dades de client, migracions, xarxa i tallafocs, esborrats
3, i una intentant trencar-ho

Independent vol dir una cosa concreta: qui valida no rep el raonament de qui va implementar. I un mateix revisant-se més tard no compta, perquè els punts cecs viatgen amb la persona.

Allò que NO compta com a validació

Aquesta és probablement la part més útil de tot el repositori, i és una llista de frases que sonen a comprovació sense ser-ho. Cadascuna va deixar passar alguna cosa alguna vegada:

«El fitxer de configuració és vàlid.» Un fitxer pot ser vàlid i tot i així fer que el procés que el llegeix el rebutgi.
«El fitxer al disc té el canvi.» Editar in situ crea un inode nou, i el contenidor va continuar llegint el vell. Cal comparar el disc amb el que el procés té obert.
«El lloc torna 200.» Un servei va estar quatre dies caigut sense que ningú se n'adonés: tornava 200 perquè la portada era una pàgina estàtica en memòria cau.
«Funciona a l'entorn de proves.» L'entorn de proves no contenia el component antic que feia perillós el de producció, així que no ho podia detectar.
«El servei està running Pot estar en bucle de reinici. Cal mirar el detall de l'estat i el log.
«Ho he desplegat i es veu bé.» La memòria cau del navegador t'està mentint.
«Ho he revisat jo un altre cop.» Mateixos punts cecs. El requisit és la independència, no el nombre.

Publicar aquest mateix article va afegir una entrada a la llista. El pipeline va sortir verd de punta a punta i el lloc no va canviar: el servei estava clavat a una versió concreta de la imatge, així que el redesplegament reconstruïa fidelment el de sempre. Webhook correcte, pipeline verd, zero canvi.

L'arranjament no va ser només desplegar bé: va ser que el pipeline verifiqui contra producció quina versió s'està servint, i falli si no és la que acaba de construir.

S'ho aplica a si mateix

Una eina que exigeix evidència no té cap autoritat si ella mateixa va sense comprovar. Així que la seva integració contínua valida la seva pròpia memòria amb el seu propi CLI, comprova que continua sense dependències d'execució i passa 286 proves. Si alguna cosa d'això falla, no entra.

Està publicat i es pot fer servir

L'hem alliberat amb llicència Apache-2.0. El va escriure Juan Carlos Vázquez a everyWAN. Funciona com a plugin de Claude Code, i el CLI va només amb Python i sense dependències: si tens python3, ja està.

Codi i documentació: github.com/everywan-dev/claude-code-engineering

No resol que la documentació s'escrigui. Resol que, quan estigui escrita, digui com sap allò que diu. Que és la part que faltava.

Etiquetes:

Documentació DevOps Open Source IA

Compartir:

Subscriu-te al nostre butlletí

Per rebre històries del món IT, novetats d'everyWAN i ofertes exclusives per a subscriptors, dona't d'alta a la nostra llista de correu

everyWAN
everyWAN