/diego/sekura EscríbemeWrite to meEscriu-me
AI Engineer · plataforma regulada full-stack · seguridad privada (España)AI Engineer · regulated full-stack platform · private security (Spain)AI Engineer · plataforma regulada full-stack · seguretat privada (Espanya)

Seguridad privada con la honestidad incrustada en el código.

Private security with honesty built into the code.

Seguretat privada amb l'honestedat incrustada al codi.

Entré a un dominio regulado y complejo sin ser del sector ni saber programar, y en ~6 semanas levanté un producto real y desplegado. Lo que lo hace distinto no es que funcione: es que el rigor y la honestidad están escritos en el propio sistema: el producto renuncia a llamar "seguridad" a lo que la ley no lo es, el motor legal se prohíbe dictaminar cumplimiento y cita el BOE o calla, y cada bug que cazo se convierte en una regla. Es un MVP (Stripe en modo test, licencia en trámite): esa disciplina es el producto.

I walked into a regulated, complex domain without being from the industry or knowing how to code, and in ~6 weeks I stood up a real, deployed product. What makes it different isn't that it works: it's that rigor and honesty are written into the system itself: the product refuses to call "security" what the law doesn't, the legal engine forbids itself from ruling on compliance and cites the BOE or stays silent, and every bug I catch becomes a rule. It's an MVP (Stripe in test mode, license pending): that discipline is the product.

Vaig entrar en un domini regulat i complex sense ser del sector ni saber programar, i en ~6 setmanes vaig aixecar un producte real i desplegat. El que el fa diferent no és que funcioni: és que el rigor i l'honestedat estan escrits en el sistema mateix: el producte renuncia a dir «seguretat» al que la llei no ho és, el motor legal es prohibeix dictaminar compliment i cita el BOE o calla, i cada bug que caço es converteix en una regla. És un MVP (Stripe en mode test, llicència en tràmit): aquesta disciplina és el producte.

sectores de reserva, los 4 operativos · 3 regímenes legalesbooking sectors, all 4 live · 3 legal regimessectors de reserva, els 4 operatius · 3 règims legals
departamentos · una empresa como softwaredepartments · a company as softwaredepartaments · una empresa com a programari
tests unit en verde · + suite RLS contra una BD realunit tests green · + RLS suite against a real DBtests unit en verd · + suite RLS contra una BD real
incidentes propios registrados · 28 de ellos → una reglaof my own incidents logged · 28 of them → a ruleincidents propis registrats · 28 d'ells → una regla
El catálogo honestoThe honest catalogEl catàleg honest

Cuatro sectores, tres regímenes legales, y el producto sabe la diferencia

Four sectors, three legal regimes, and the product knows the difference

Quatre sectors, tres règims legals, i el producte sap la diferència

La misma UI vende cuatro sectores, pero por debajo el código distingue con precisión cuáles son legalmente "seguridad privada" y cuáles no. Dos de los cuatro no lo son, y la copy de cara al cliente lo admite, porque venderlos como "seguridad" sería intrusismo. La ley encajada en el catálogo, no en un disclaimer.

The same UI sells four sectors, but underneath the code precisely tells which are legally "private security" and which are not. Two of the four are not, and the client-facing copy admits it, because selling them as "security" would be an offense. The law embedded in the catalog, not in a disclaimer.

La mateixa UI ven quatre sectors, però per sota el codi distingeix amb precisió quins són legalment «seguretat privada» i quins no. Dos dels quatre no ho són, i la copy de cara al client ho admet, perquè vendre'ls com a «seguretat» seria intrusisme. La llei encaixada al catàleg, no en un disclaimer.

SectorSectorSector Régimen legalLegal regimeRègim legal Cómo se contrataHow it's engagedCom es contracta ¿Seguridad privada?Private security?Seguretat privada?
EscoltaBodyguardEscortaProtección de personas · flota + nivelesPersonal protection · fleet + tiersProtecció de persones · flota + nivells Ley 5/2014 · seguridad privadaLaw 5/2014 · private securityLey 5/2014 · seguretat privada autorización estatal · por contrataciónstate authorization · per engagementautorització estatal · per contractació SÍYESSÍ
VigilanteSecurity guardVigilantVigilancia estática / presencialStatic / on-site guardingVigilància estàtica / presencial Ley 5/2014 · seguridad privadaLaw 5/2014 · private securityLey 5/2014 · seguretat privada self-service · sin autorización individualself-service · no individual authorizationself-service · sense autorització individual SÍYESSÍ
Controlador de accesoAccess controllerControlador d'accésAdmisión y aforo en espectáculosAdmission & capacity at eventsAdmissió i aforament en espectacles Régimen autonómico de espectáculosRegional entertainment-venue regimeRègim autonòmic d'espectacles self-service · acreditación autonómicaself-service · regional accreditationself-service · acreditació autonòmica NONONO
Personal auxiliarAuxiliary staffPersonal auxiliarRecepción · conserjería · control administrativoReception · concierge · administrative controlRecepció · consergeria · control administratiu Art. 6.2 · "personal auxiliar análogo"Art. 6.2 · "analogous auxiliary staff"Art. 6.2 · «personal auxiliar anàleg» self-service · fuera del ámbito de la leyself-service · outside the law's scopeself-service · fora de l'àmbit de la llei NONONO
Honestidad como arquitecturaHonesty as architectureHonestedat com a arquitectura

El controlador de acceso (régimen autonómico de espectáculos) y el personal auxiliar (art. 6.2) no son seguridad privada, y el motor lo sabe: cada sector lleva su régimen, y el gate legal exime a los que la ley no obliga (sin autorización estatal, sin contrato del art. 20.1). Cada servicio compone además una calculadora distinta y una tabla de asignación propia; un cliente puede pedir varios a la vez para un evento, y cada uno conserva intacta su maquinaria legal. Hubo un 5.º sector planeado ("Cuerpos del Estado", ex-agentes que protegen personas) y se retiró, no por falta de tiempo: el BOE tiene una lista cerrada de habilitaciones (art. 26.1) y un ex-agente que protege personas ya es un escolta habilitado, no una categoría aparte. Mantener el rótulo habría sido la promesa pública falsa; retirarlo fue lo que la ley exigía.

Access control (regional entertainment regime) and auxiliary staff (art. 6.2) are not private security, and the engine knows it: each sector carries its regime, and the legal gate exempts those the law doesn't bind (no state authorization, no art. 20.1 contract). Each service also composes a distinct calculator and its own assignment table; a client can request several at once for one event, and each keeps its legal machinery intact. A planned 5th sector ("State forces", ex-officers doing personal protection) got pulled, and not for lack of time: the BOE has a closed list of authorizations (art. 26.1), and an ex-officer protecting people already is a licensed bodyguard, not a separate category. Keeping the label would have been the false public promise; pulling it is what the law required.

El controlador d'accés (règim autonòmic d'espectacles) i el personal auxiliar (art. 6.2) no són seguretat privada, i el motor ho sap: cada sector porta el seu règim, i el gate legal eximeix els que la llei no obliga (sense autorització estatal, sense contracte de l'art. 20.1). Cada servei compon a més una calculadora diferent i una taula d'assignació pròpia; un client en pot demanar diversos alhora per a un esdeveniment, i cadascun conserva intacta la seva maquinària legal. Hi va haver un 5è sector planejat («Cossos de l'Estat», ex-agents que protegeixen persones) i es va retirar, no per falta de temps: el BOE té una llista tancada d'habilitacions (art. 26.1) i un ex-agent que protegeix persones ja és un escorta habilitat, no una categoria a part. Mantenir el rètol hauria estat la promesa pública falsa; retirar-lo és el que la llei exigia.

El invariante más fino · designar ≠ asignarThe finest invariant · designate ≠ assignL'invariant més fi · designar ≠ assignar

Quien consta autorizado ante la Administración es quien presta el servicio

Whoever is on record as authorized is whoever provides the service

Qui consta autoritzat davant l'Administració és qui presta el servei

La protección de personas exige autorización específica para cada contratación, con la identidad de los profesionales concretos. Eso obliga a separar el dato legal del permiso de datos: nombrar a alguien en el expediente no le da acceso; darle acceso exige reserva pagada y que conste en ese expediente. Tocar el equipo caduca el expediente y bloquea cobro y prestación.

Personal protection requires a specific authorization for each engagement, naming the concrete professionals. That forces a split between the legal fact and the data permission: naming someone in the file does not grant access; granting access requires a paid booking and that they're on that file. Touching the team expires the file and blocks charging and provision.

La protecció de persones exigeix autorització específica per a cada contractació, amb la identitat dels professionals concrets. Això obliga a separar la dada legal del permís de dades: anomenar algú a l'expedient no li dona accés; donar-li accés exigeix reserva pagada i que consti en aquell expedient. Tocar l'equip caduca l'expedient i bloqueja cobrament i prestació.

SOLICITUDREQUESTSOL·LICITUD el cliente pidethe client asksel client demana DESIGNARDESIGNATEDESIGNAR dato legal · NO da accesolegal fact · grants NO accessdada legal · NO dona accés AUTORIZARAUTHORIZEAUTORITZAR ante la Administración · equipo completobefore the Administration · full teamdavant l'Administració · equip complet CONTRATO + COMUNICARCONTRACT + NOTIFYCONTRACTE + COMUNICAR por escrito · comunicado antesin writing · notified beforehandper escrit · comunicat abans PAGAR SEÑALPAY DEPOSITPAGAR SENYAL bloqueado sin autorizaciónblocked without authorizationbloquejat sense autorització recálculo en el servidorserver-side recomputerecàlcul al servidor 🔒 ASIGNARASSIGNASSIGNAR la llave de lectura de datosthe data-read keyla clau de lectura de dades exige pagado + designadorequires paid + designatedexigeix pagat + designat PRESTAR — el gatePROVIDE — the gatePRESTAR — el gate solo si: autorizado ∧ contrato comunicadoonly if: authorized ∧ contract notifiednomés si: autoritzat ∧ contracte comunicat ∧ asignados ⊆ designados ∧ equipo completo∧ assigned ⊆ designated ∧ full team∧ assignats ⊆ designats ∧ equip complet un solo predicado, en un solo sitioone predicate, in one placeun sol predicat, en un sol lloc COMPLETARCOMPLETECOMPLETAR servicio prestado + cierreservice provided + closeservei prestat + tancament ✓ ↻ tocar el equipo caduca el expediente → bloquea cobro y prestación ↻ touching the team expires the file → blocks charging and provision↻ tocar l'equip caduca l'expedient → bloqueja cobrament i prestació

Pellizca para acercar y leer el detalle ↔Pinch to zoom in and read the detail ↔Pessiga per apropar i llegir el detall ↔

Etiquetas conceptuales, no el esquema real. El invariante rector: quien consta autorizado ante la Administración == quien presta el servicio. Los sectores self-service (vigilancia, controlador, auxiliar) saltan el trámite de autorización; la protección de personas no.

Conceptual labels, not the real schema. The governing invariant: whoever is on record as authorized == whoever provides the service. The self-service sectors (guarding, access control, auxiliary) skip the authorization step; personal protection doesn't.

Etiquetes conceptuals, no l'esquema real. L'invariant rector: qui consta autoritzat davant l'Administració == qui presta el servei. Els sectors self-service (vigilància, controlador, auxiliar) salten el tràmit d'autorització; la protecció de persones no.

concepto clave (dato / llave)key concept (fact / key)concepte clau (dada / clau) en trámitein progressen tràmit gate / bloqueadogate / blockedgate / bloquejat completadocompletedcompletat
El back-officeThe back-officeEl back-office

El Centro de Mando: una empresa como software

The Command Center: a company as software

El Centre de Comandament: una empresa com a programari

No es un panel de admin: son ocho departamentos, cada uno un área de negocio con su propia lógica, girando alrededor del ciclo de vida de la reserva. Un solo dev construyó el back-office entero de una empresa de seguridad.

It's not an admin panel: it's eight departments, each a business area with its own logic, spinning around the booking lifecycle. One dev built the whole back-office of a security company.

No és un panell d'admin: són vuit departaments, cadascun una àrea de negoci amb la seva pròpia lògica, girant al voltant del cicle de vida de la reserva. Un sol dev va construir el back-office sencer d'una empresa de seguretat.

pasa el ratón por un departamento para resaltarlohover a department to highlight itpassa el ratolí per un departament per ressaltar-lo
1 OPERACIONESOPERATIONSOPERACIONS

El ciclo de la reservaThe booking cycleEl cicle de la reserva

Máquina de estados, verificar, asignar, arrancar el servicio.State machine, verify, assign, start the service.Màquina d'estats, verificar, assignar, arrencar el servei.

2 PROFESIONALESPROFESSIONALSPROFESSIONALS

Verificar habilitadosVetting the licensedVerificar habilitats

Documento en bucket privado; el admin lo ve por URL firmada efímera.Document in a private bucket; admin views it via a short-lived signed URL.Document en bucket privat; l'admin el veu per URL signada efímera.

3 MIEMBROSMEMBERSMEMBRES

El equipo internoThe internal teamL'equip intern

Altas del back-office y su matriz de permisos por departamento.Back-office members and their per-department permission matrix.Altes del back-office i la seva matriu de permisos per departament.

4 FINANCIEROFINANCEFINANCER

Ingresos honestosHonest revenueIngressos honestos

Solo cuenta lo cobrado real (no el sembrado); costes, márgenes, proyección.Only real charges count (not seeded); costs, margins, projection.Només compta el cobrat real (no el sembrat); costos, marges, projecció.

5 LEGALLEGALLEGAL

Normativa + expedientesRegulation + filesNormativa + expedients

Watchlist de normas, registro de riesgos, contratos y autorizaciones.Rules watchlist, risk registry, contracts and authorizations.Watchlist de normes, registre de riscos, contractes i autoritzacions.

6 CRMCRMCRM

Relación con el clienteClient relationshipRelació amb el client

Tickets y conversaciones de doble cara, aisladas del profesional.Two-sided tickets and threads, isolated from the professional.Tickets i converses de doble cara, aïllades del professional.

7 RRHHHRRRHH

Personal contratadoContracted staffPersonal contractat

Contratos laborales + el candado: nadie presta sin contrato vigente.Employment contracts + the lock: no one provides without a live contract.Contractes laborals + el pany: ningú presta sense contracte vigent.

8 CIBERSEGURIDADCYBERSECURITYCIBERSEGURETAT

Postura en vivoLive posturePostura en viu

Checks evaluados contra el estado real del sistema, no hardcodeados.Checks evaluated against the system's real state, not hardcoded.Checks avaluats contra l'estat real del sistema, no hardcodejats.

Recórrelo en la demo en vivoWalk it in the live demoRecorre'l a la demo en viu →
vista previa · centro de mandopreview · command centrevista prèvia · centre de comandament

Recorrido por los 8 departamentos operando: se avanza una reserva y se cambia un permiso en vivo · datos de ejemplo, sin PII real.Tour of the 8 departments in operation: a booking is advanced and a permission toggled live · sample data, no real PII.Recorregut pels 8 departaments operant: s'avança una reserva i es canvia un permís en viu · dades d'exemple, sense PII real.

Honestidad del RBACRBAC honestyHonestedat del RBAC

El acceso se resuelve con doble gate fail-closed (¿es del back-office? · ¿tiene ese departamento?), reusando las mismas queries en la página, la acción y la UI para que no puedan contradecirse. Y una honestidad que está en los propios comentarios del código: es RBAC de capa-app (el panel lee con una clave de servicio que salta la RLS), así que jamás lo vendo como "permisos aislados en la base de datos". Un noveno tab, Roadmap, es un mapa de solo lectura del pipe entero que dice, por reserva real, qué la bloquea, reusando los mismos predicados del servidor, nunca reimplementándolos.

Access is resolved with a fail-closed double gate (in the back-office? · has that department?), reusing the same queries in the page, the action and the UI so they can't contradict each other. And an honesty written in the code's own comments: it's app-layer RBAC (the panel reads with a service key that bypasses RLS), so I never sell it as "permissions isolated in the database". A ninth tab, Roadmap, is a read-only map of the whole pipe that says, per real booking, what blocks it, reusing the server's own predicates, never reimplementing them.

L'accés es resol amb doble gate fail-closed (és del back-office? · té aquell departament?), reutilitzant les mateixes queries a la pàgina, l'acció i la UI perquè no es puguin contradir. I una honestedat que és als mateixos comentaris del codi: és RBAC de capa-app (el panell llegeix amb una clau de servei que salta la RLS), així que mai el venc com a «permisos aïllats a la base de dades». Un novè tab, Roadmap, és un mapa de només lectura del pipe sencer que diu, per reserva real, què la bloqueja, reutilitzant els mateixos predicats del servidor, mai reimplementant-los.

Confidencialidad como featureConfidentiality as a featureConfidencialitat com a feature

Siete capas que asumen que la anterior pudo fallar

Seven layers that assume the previous one could fail

Set capes que assumeixen que l'anterior va poder fallar

Es un servicio de protección: la identidad, la ubicación y la agenda del cliente son PII cuya fuga es catastrófica. Por eso "no filtrar" es un requisito de diseño, no un extra, y en ningún punto se confía en el navegador.

It's a protection service: the client's identity, location and schedule are PII whose leak is catastrophic. So "don't leak" is a design requirement, not an extra, and at no point is the browser trusted.

És un servei de protecció: la identitat, la ubicació i l'agenda del client són PII la fuita de la qual és catastròfica. Per això «no filtrar» és un requisit de disseny, no un extra, i en cap punt es confia en el navegador.

1 INPUTS DEL CLIENTECLIENT INPUTSINPUTS DEL CLIENT nunca el total, solo los datosnever the total, only the inputsmai el total, només les dades 2 PRECIO RECALCULADO EN SERVIDORPRICE RECOMPUTED SERVER-SIDEPREU RECALCULAT AL SERVIDOR aborta si no cuadraaborts if it doesn't matchavorta si no quadra 3 GATE DE AUTORIZACIÓN · fail-closedAUTHORIZATION GATE · fail-closedGATE D'AUTORITZACIÓ · fail-closed un predicado, tres puntos del flujoone predicate, three points of the flowun predicat, tres punts del flux 4 WEBHOOK FIRMADO + IDEMPOTENTESIGNED + IDEMPOTENT WEBHOOKWEBHOOK SIGNAT + IDEMPOTENT la única autoridad del cobrothe only authority on the chargel'única autoritat del cobrament 5 RLS POR FILAROW-LEVEL SECURITYRLS PER FILA cada rol ve solo lo suyoeach role sees only its owncada rol veu només el seu 6 PERMISO POR COLUMNACOLUMN-LEVEL GRANTSPERMÍS PER COLUMNA la PII no se concede a la sesiónPII isn't granted to the sessionla PII no es concedeix a la sessió 7 STORAGE PRIVADO + URL FIRMADAPRIVATE STORAGE + SIGNED URLSTORAGE PRIVAT + URL SIGNADA efímera · nunca públicaephemeral · never publicefímera · mai pública PII PROTEGIDAPII PROTECTEDPII PROTEGIDA identidad · ubicación · agendaidentity · location · scheduleidentitat · ubicació · agenda 🔒

Pellizca para acercar y leer el detalle ↔Pinch to zoom in and read the detail ↔Pessiga per apropar i llegir el detall ↔

El detalle que lo hace serio: se descubrió que un permiso de tabla completa dejaba a un profesional asignado leer PII del cliente por el API directo aunque ninguna pantalla la mostrara; el fix estrechó el permiso a la unión exacta de columnas que la app usa. Dos costuras independientes (precio y pago) y la firma del gate se cambió a propósito para romper el build en sus tres call-sites, para que nadie se olvide de uno.

The detail that makes it serious: a full-table grant was found to let an assigned professional read client PII via the direct API even though no screen showed it; the fix narrowed the grant to the exact union of columns the app uses. Two independent seams (price and payment), and the gate's signature was changed on purpose to break the build across its three call-sites, so nobody forgets one.

El detall que ho fa seriós: es va descobrir que un permís de taula completa deixava un professional assignat llegir PII del client per l'API directe encara que cap pantalla la mostrés; el fix va estrènyer el permís a la unió exacta de columnes que l'app fa servir. Dues costures independents (preu i pagament) i la signatura del gate es va canviar a propòsit per trencar el build als seus tres call-sites, perquè ningú se n'oblidi de cap.

Verificado, no confiadoVerified, not trustedVerificat, no confiat

Un escolta asignado a un servicio no puede ver la identidad del cliente ni la de otros profesionales, y no es una promesa: es una suite de tests por rol que corre contra una base de datos real y distingue "cero filas por RLS" de "permiso denegado por columna", dos modos de fallo que un test perezoso confundiría. La postura de seguridad se lee en vivo (¿RLS activa en toda tabla? ¿buckets privados? ¿unicidad del cobro?), nunca se afirma.

A bodyguard assigned to a service cannot see the client's identity or other professionals', and it's not a promise: it's a per-role test suite that runs against a real database and distinguishes "zero rows by RLS" from "permission denied by column", two failure modes a lazy test would conflate. The security posture is read live (RLS on every table? private buckets? charge uniqueness?), never asserted.

Un escorta assignat a un servei no pot veure la identitat del client ni la d'altres professionals, i no és una promesa: és una suite de tests per rol que corre contra una base de dades real i distingeix «zero files per RLS» de «permís denegat per columna», dos modes de fallada que un test mandrós confondria. La postura de seguretat es llegeix en viu (RLS activa a tota taula? buckets privats? unicitat del cobrament?), mai s'afirma.

El registro de incidentesThe incident ledgerEl registre d'incidents

Bugs que cacé en mi propio sistema, y qué aprendí de cada uno

Bugs I caught in my own system, and what each one taught me

Bugs que vaig caçar al meu propi sistema, i què vaig aprendre de cadascun

No presumo de no tener bugs. Presumo de un sistema que los caza: un registro append-only donde cada incidente se convierte en una regla que la próxima sesión aplica sola. Estos son reales, del propio proyecto (32 en total), contados a nivel de patrón, sin exponer el esquema.

I don't brag about having no bugs. I brag about a system that catches them: an append-only ledger where each incident becomes a rule the next session applies on its own. These are real, from the project (32 total), told at the pattern level: no schema exposed.

No presumeixo de no tenir bugs. Presumeixo d'un sistema que els caça: un registre append-only on cada incident es converteix en una regla que la sessió següent aplica sola. Aquests són reals, del mateix projecte (32 en total), explicats a nivell de patró, sense exposar l'esquema.

IncidenteIncidentIncident Qué eraWhat it wasQuè era EvidenciaEvidenceEvidència VeredictoVerdictVeredicte
El gate que reabría su propio agujeroThe gate that reopened its own holeEl gate que reobria el seu propi foratUn gate nuevo debía impedir prestar sin equipo.A new gate was meant to block provision without a team.Un gate nou havia d'impedir prestar sense equip. Con nadie designado, comparaba 0 == 0 y daba luz verde → se podía cobrar y prestar un servicio con cero profesionales. Más un fail-open por un dato ausente que el compilador no ve.With nobody designated, it compared 0 == 0 and went green → you could charge and provide a service with zero professionals. Plus a fail-open on a missing value the compiler can't see.Sense ningú designat, comparava 0 == 0 i donava llum verda → es podia cobrar i prestar un servei amb zero professionals. Més un fail-open per una dada absent que el compilador no veu. reproducido ejecutando el predicado real + 2.º pasereproduced by running the real predicate + 2nd passreproduït executant el predicat real + 2n pas cazado pre-pushcaught pre-pushcaçat pre-push
Recursión en las reglas de accesoRecursion in the access rulesRecursió a les regles d'accésDos tablas que se referenciaban en círculo.Two tables referencing each other in a loop.Dues taules que es referenciaven en cercle. La primera auditoría de seguridad no la vio. Apareció en el segundo pase independiente; se rompió con funciones de definición segura.The first security audit missed it. It surfaced on the independent second pass; broken with security-definer functions.La primera auditoria de seguretat no la va veure. Va aparèixer al segon pas independent; es va trencar amb funcions de definició segura. cubierto luego por la suite RLS reallater covered by the real RLS suitecobert després per la suite RLS real doble pasedouble passdoble pas
Fuga de datos por una función expuestaData leak via an exposed functionFuita de dades per una funció exposadaUna función consultable por API saltaba el cero-grant.An API-callable function bypassed the zero-grant.Una funció consultable per API saltava el zero-grant. Al crearse, concedía permiso al público por defecto: cualquier usuario autenticado podía sondear estatus de personal (PII) por una vía lateral, saltándose el blindaje de la tabla.On creation it granted the public by default: any authenticated user could probe staff status (PII) through a side channel, bypassing the table's lockdown.En crear-se, concedia permís al públic per defecte: qualsevol usuari autenticat podia sondejar estat de personal (PII) per una via lateral, saltant-se el blindatge de la taula. test que asierta permiso denegado por esa víatest asserting permission denied by that pathtest que asserta permís denegat per aquella via cazado + testcaught + testcaçat + test
La red de seguridad estaba apagadaThe safety net was offLa xarxa de seguretat estava apagadaLa CI llevaba 12 corridas en rojo desde la primera.CI had been red for 12 runs since the first.La CI portava 12 corregudes en vermell des de la primera. En local siempre pasaba (hay secretos) y el despliegue va por su cuenta → nadie lo notó. El check automático no protegía nada. Se descubrió al mirar el panel de verdad.Locally it always passed (secrets present) and deploy is independent → nobody noticed. The automatic check protected nothing. Found by actually looking at the panel.En local sempre passava (hi ha secrets) i el desplegament va pel seu compte → ningú ho va notar. El check automàtic no protegia res. Es va descobrir en mirar el panell de veritat. registro de la corrida fallida → verde en la #13/#14failed-run log → green on #13/#14registre de la correguda fallida → verd a la #13/#14 reactivada + reglare-armed + rulereactivada + regla
El invariante sobre la tabla que documentaThe invariant on the documenting tableL'invariant sobre la taula que documentaSe blindó el registro, no lo que concede el acceso.The record was locked, not what grants access.Es va blindar el registre, no el que concedeix l'accés. Se podía autorizar a una persona y prestar con otra: el gate miraba la tabla que documenta la decisión, no la que de verdad la ejecuta.You could authorize one person and provide with another: the gate watched the table that documents the decision, not the one that actually executes it.Es podia autoritzar una persona i prestar amb una altra: el gate mirava la taula que documenta la decisió, no la que de veritat l'executa. gate movido a donde ocurre (+ trigger en BD)gate moved to where it happens (+ DB trigger)gate mogut on passa (+ trigger a BD) → regla→ rule→ regla
La etapa que no se parece a las demásThe stage unlike the othersL'etapa que no s'assembla a les altresDos etapas "sellaban una versión"; la tercera era una fecha.Two stages "sealed a version"; the third was a date.Dues etapes «segellaven una versió»; la tercera era una data. El invariante se puso en las etapas que se parecen y se olvidó en la que no (comunicar), que quedó como un booleano rancio → se prestaba con la versión que la Administración nunca vio.The invariant went on the stages that look alike and was forgotten on the one that doesn't (notify), left as a stale boolean → provision with a version the Administration never saw.L'invariant es va posar a les etapes que s'assemblen i es va oblidar a la que no (comunicar), que va quedar com un booleà ranci → es prestava amb la versió que l'Administració no va veure mai. enumerar las etapas por EFECTO, no por formaenumerate stages by EFFECT, not by shapeenumerar les etapes per EFECTE, no per forma → regla→ rule→ regla
Verde en local, denegado en runtimeGreen locally, denied at runtimeVerd en local, denegat en runtimeUn permiso por columnas no cubría la columna del filtro.A column grant missed the column in the filter.Un permís per columnes no cobria la columna del filtre. Compilador, tests y build en verde; la base de datos exige permiso sobre toda columna referenciada, incluidas las del WHERE. Un fallback honesto casi ocultó el fallo en una página pública.Compiler, tests and build all green; the database requires permission on every referenced column, including those in the WHERE. An honest fallback nearly hid the failure on a public page.Compilador, tests i build en verd; la base de dades exigeix permís sobre tota columna referenciada, incloses les del WHERE. Un fallback honest gairebé va amagar la fallada en una pàgina pública. solo lo vio la corrida contra la BD realonly the run against the real DB saw itnomés ho va veure la correguda contra la BD real verde local ≠ runtimegreen local ≠ runtimeverd local ≠ runtime
Un "admin" que abría PII a todosAn "admin" that opened PII to allUn «admin» que obria PII a tothomUna regla de cinturón exponía texto libre del cliente.A belt-and-suspenders rule exposed the client's free text.Una regla de cinturó exposava text lliure del client. Como todo el back-office comparte el mismo rol técnico, una regla basada en "es admin" abría la PII más sensible a cualquier miembro por su propio token, saltándose el permiso fino por departamento.Since the whole back-office shares one technical role, a rule based on "is admin" opened the most sensitive PII to any member via their own token, bypassing the fine-grained departmental permission.Com que tot el back-office comparteix el mateix rol tècnic, una regla basada en «és admin» obria la PII més sensible a qualsevol membre pel seu propi token, saltant-se el permís fi per departament. cero-grant-a-admin; nunca desplegadozero-grant-to-admin; never shippedzero-grant-a-admin; mai desplegat cazado pre-pushcaught pre-pushcaçat pre-push
Dos citas del BOE que no eran literalesTwo BOE quotes that weren't literalDues cites del BOE que no eren literalsUna auditoría cazó dos citas fabricadas en el propio catálogo legal.An audit caught two fabricated citations in the legal catalog itself.Una auditoria va caçar dues citacions fabricades al mateix catàleg legal. Un fetch parafraseó en vez de transcribir: una cita entre comillas no existía con esas palabras en el BOE, y otra citaba un artículo que no dice lo que afirmábamos. El mismo fallo que ya había costado un hecho legal inventado, esta vez dentro del catálogo que existe para citarlo bien.A fetch paraphrased instead of transcribing: one quoted string didn't exist verbatim in the BOE, and another cited an article that doesn't say what we claimed. The same failure that had already produced an invented legal fact, this time inside the catalog that exists to cite it right.Un fetch va parafrasejar en lloc de transcriure: una cita entre cometes no existia amb aquestes paraules al BOE, i una altra citava un article que no diu el que afirmàvem. La mateixa fallada que ja havia costat un fet legal inventat, aquesta vegada dins del catàleg que existeix per citar-lo bé. verificador puro: literal vs. bloque oficial del BOEpure verifier: literal vs. official BOE blockverificador pur: literal vs. bloc oficial del BOE → gate en el CI→ CI gate→ gate al CI
La prueba de que el juicio es humanoProof the judgment is humanLa prova que el judici és humà

Cómo un gate que yo mismo escribí reabría el agujero que cerraba

How a gate I wrote myself reopened the hole it was closing

Com un gate que jo mateix vaig escriure reobria el forat que tancava

Probar los valores degenerados de tu propio gate (el conjunto vacío, el dato ausente) justo cuando todos los tests están en verde. Esa es la señal que un escéptico cree imposible en un perfil construido con IA.

Testing the degenerate values of your own gate (the empty set, the missing value) right when every test is green. That's the signal a skeptic assumes is impossible in an AI-built profile.

Provar els valors degenerats del teu propi gate (el conjunt buit, la dada absent) just quan tots els tests estan en verd. Aquest és el senyal que un escèptic creu impossible en un perfil construït amb IA.

# un gate nuevo debía impedir prestar sin equipo… version_designada = 0 // nadie designado aún version_sellada = 0 // se selló "0" gate: 0 == 0 → true // luz VERDE # → cobrar y PRESTAR con CERO profesionales # (el mismo agujero que venía a cerrar) # y un fail-open: el dato ausente llega como… if (valor === null) ... // NO cubre "undefined" # el compilador no lo caza: el tipo se AFIRMA # verificado ejecutando el predicado real: casos degenerados (vacío · ausente · enum raro) → tests
# a new gate was meant to block provision with no team… designated_version = 0 // nobody designated yet sealed_version = 0 // "0" got sealed gate: 0 == 0 → true // GREEN light # → charge and PROVIDE with ZERO professionals # (the very hole it came to close) # and a fail-open: the missing value arrives as… if (value === null) ... // does NOT cover "undefined" # the compiler misses it: the type is ASSERTED # verified by running the real predicate: degenerate cases (empty · missing · odd enum) → tests
# un gate nou havia d'impedir prestar sense equip… version_designada = 0 // ningú designat encara version_sellada = 0 // es va segellar "0" gate: 0 == 0 → true // llum VERDA # → cobrar i PRESTAR amb ZERO professionals # (el mateix forat que venia a tancar) # i un fail-open: la dada absent arriba com a… if (valor === null) ... // NO cobreix "undefined" # el compilador no ho caça: el tipus s'AFIRMA # verificat executant el predicat real: casos degenerats (buit · absent · enum rar) → tests

Sospeché del caso feliz. Los 14 tests del gate estaban en verde, pero todos fijaban el mismo caso cómodo, así que ninguno tocaba el conjunto vacío ni el dato ausente. Un fixture que solo genera el caso bueno es un punto ciego, no cobertura.

Lo reproduje ejecutando el predicado real (no leído de un informe) y un segundo pase de auditoría lo confirmó. Cerré las tres puertas y añadí tests de los casos degenerados.

Probar los valores degenerados de tu propio gate, no el caso feliz, es lo que se transfiere a un equipo.

I got suspicious of the happy path. The gate's 14 tests were green, but all pinned the same comfortable case, so none touched the empty set or the missing value. A fixture that only builds the good case is a blind spot, not coverage.

I reproduced it by running the real predicate (not read from a report) and a second audit pass confirmed it. I closed all three doors and added tests for the degenerate cases.

Testing your own gate's degenerate values, not the happy path, is what transfers to a team.

Vaig sospitar del cas feliç. Els 14 tests del gate estaven en verd, però tots fixaven el mateix cas còmode, així que cap tocava el conjunt buit ni la dada absent. Un fixture que només genera el cas bo és un punt cec, no cobertura.

El vaig reproduir executant el predicat real (no llegit d'un informe) i un segon pas d'auditoria ho va confirmar. Vaig tancar les tres portes i vaig afegir tests dels casos degenerats.

Provar els valors degenerats del teu propi gate, no el cas feliç, és el que es transfereix a un equip.

La segunda lección incómodaThe second uncomfortable lessonLa segona lliçó incòmoda

Mi red de seguridad llevaba semanas apagada, y verde no significaba verde

My safety net had been off for weeks, and green didn't mean green

La meva xarxa de seguretat portava setmanes apagada, i verd no volia dir verd

La verificación automática es inútil si nadie mira si de verdad corre. La mía llevaba 12 corridas en rojo desde la primera, tapada por dos coincidencias.

Automatic verification is useless if nobody checks it actually runs. Mine had been red for 12 runs since the first, hidden by two coincidences.

La verificació automàtica és inútil si ningú mira si de veritat corre. La meva portava 12 corregudes en vermell des de la primera, tapada per dues coincidències.

# la red de seguridad automática (CI)… corridas verdes: 0 / 12 // ROJO desde la #1 # nadie lo vio, por dos coincidencias: local pasa // hay secretos → siempre verde deploy sube // independiente → tapa el síntoma # miré el panel de VERDAD: $ ci status → collecting page data … FAILED causa: un secreto leído al IMPORTAR un módulo (en CI no hay secreto, por diseño) # fix en 2 capas → #13, #14 verdes
# the automatic safety net (CI)… green runs: 0 / 12 // RED since #1 # nobody saw it, via two coincidences: local passes // secrets present → always green deploy ships // independent → hides the symptom # I looked at the REAL panel: $ ci status → collecting page data … FAILED cause: a secret read at module IMPORT time (no secret in CI, by design) # fix in 2 layers → #13, #14 green
# la xarxa de seguretat automàtica (CI)… corregudes verdes: 0 / 12 // VERMELL des de la #1 # ningú ho va veure, per dues coincidències: local passa // hi ha secrets → sempre verd deploy puja // independent → tapa el símptoma # vaig mirar el panell de VERITAT: $ ci status → collecting page data … FAILED causa: un secret llegit en IMPORTAR un mòdul (a CI no hi ha secret, per disseny) # fix en 2 capes → #13, #14 verdes

Doce corridas en rojo y nadie lo notó: en local hay secretos, así que siempre pasaba; y el despliegue va por su cuenta, así que la demo seguía subiendo y tapaba el síntoma. La causa: un secreto que se leía al importar un módulo, y en la CI no hay secreto a propósito.

No apareció hasta que miré el panel de verdad en lugar de asumir que estaba verde. Se convirtió en regla: verifica en el modo plano (como corre la CI), y vigila el estado REAL, no el que supones.

Vigilar el estado real, no asumirlo: eso se transfiere.

Twelve red runs and nobody noticed: locally there are secrets, so it always passed; and deploy runs on its own, so the demo kept shipping and hid the symptom. The cause: a secret read at import time, and CI has no secret on purpose.

It didn't show until I looked at the real panel instead of assuming green. It became a rule: verify in the bare mode (as CI runs), and watch the REAL state, not the one you assume.

Watching the real state, not assuming it: that transfers.

Dotze corregudes en vermell i ningú ho va notar: en local hi ha secrets, així que sempre passava; i el desplegament va pel seu compte, així que la demo seguia pujant i tapava el símptoma. La causa: un secret que es llegia en importar un mòdul, i a la CI no hi ha secret a propòsit.

No va aparèixer fins que vaig mirar el panell de veritat en lloc d'assumir que estava verd. Es va convertir en regla: verifica en el mode pla (com corre la CI), i vigila l'estat REAL, no el que suposes.

Vigilar l'estat real, no assumir-lo: això es transfereix.

Cómo trabajo con IAHow I work with AICom treballo amb IA

Un sistema inmune: la IA construye, un panel escéptico ataca

An immune system: AI builds, a skeptical panel attacks

Un sistema immune: la IA construeix, un panell escèptic ataca

No le pido a la IA una respuesta. Orquesto flotas de agentes que se auditan entre sí: uno propone un cambio, otros intentan refutarlo por lentes distintas, y un asiento de síntesis re-deriva cada veredicto del código. Un cambio sensible solo pasa si resiste el ataque, y cada fallo que se cuela se convierte en un anticuerpo.

I don't ask the AI for an answer. I orchestrate fleets of agents that audit each other: one proposes a change, others try to refute it through distinct lenses, and a synthesis seat re-derives every verdict from the code. A sensitive change ships only if it withstands the attack, and every failure that slips through becomes an antibody.

No li demano a la IA una resposta. Orquestro flotes d'agents que s'auditen entre si: un proposa un canvi, altres intenten refutar-lo per lents diferents, i un seient de síntesi re-deriva cada veredicte del codi. Un canvi sensible només passa si resisteix l'atac, i cada fallada que s'escola es converteix en un anticòs.

cada fallo → el registro de incidentes → una regla que previene el próximo every failure → the incident ledger → a rule that prevents the nextcada fallada → el registre d'incidents → una regla que evita la següent ATAQUE ADVERSARIAL · lentes disjuntas intentan refutar ADVERSARIAL ATTACK · disjoint lenses try to refuteATAC ADVERSARIAL · lents disjuntes intenten refutar UN CAMBIOA CHANGEUN CANVI se proponeis proposedes proposa CALIBRARCALIBRATECALIBRAR por superficie, no por líneasby surface, not by linesper superfície, no per línies RBAC privilegiosprivilegesprivilegis RLS · PII aislamiento por rolrole isolationaïllament per rol PAGOSPAYMENTSPAGAMENTS precio · estadosprice · statespreu · estats HONESTIDADHONESTYHONESTEDAT cifras vs fuentefigures vs sourcexifres vs font EL CAMBIOTHE CHANGEEL CANVI bajo ataqueunder attacksota atac SÍNTESISSYNTHESISSÍNTESI re-deriva del códigore-derives from codere-deriva del codi show your workshow your workshow your work SEGUROSAFESEGUR → push ✓ BLOQUEABLOCKBLOQUEJA hallazgo → ledgerfinding → ledgertroballa → ledger ✗

Pellizca para acercar y leer el detalle ↔Pinch to zoom in and read the detail ↔Pessiga per apropar i llegir el detall ↔

Un cambio sensible pasa solo si resiste el ataque. El juicio es de la síntesis que re-deriva del código, no de un agente que "reporta OK".

A sensitive change ships only if it withstands the attack. Judgment belongs to the synthesis that re-derives from code, not to an agent that "reports OK".

Un canvi sensible passa només si resisteix l'atac. El judici és de la síntesi que re-deriva del codi, no d'un agent que «reporta OK».

Los 3 loopsThe 3 loopsEls 3 loops

Cambios, Seguridad y Legal: atacan tres verdades distintas. Todo cambio se descompone con un agente que lee el código real; se verifica por ejecución, no por informe. Ningún "reportó que está OK" cierra nada.Changes, Security and Legal: they attack three distinct truths. Every change is decomposed by an agent that reads the real code; verified by execution, not report. No "it reported OK" closes anything.Canvis, Seguretat i Legal: ataquen tres veritats diferents. Tot canvi es descompon amb un agent que llegeix el codi real; es verifica per execució, no per informe. Cap «va reportar que està OK» tanca res.

El que no puede citar, callaWho can't cite, stays silentEl qui no pot citar, calla

Un hecho sin fuente es una mentira plausible. El pivote legal se verificó literalmente en el BOE, no de memoria: una vez un agente se inventó un hecho legal, y por eso todo dato lleva su fuente o no entra.A fact without a source is a plausible lie. The legal pivot was verified literally in the BOE, not from memory, once an agent invented a legal fact, so now every claim carries its source or it doesn't ship.Un fet sense font és una mentida plausible. El pivot legal es va verificar literalment al BOE, no de memòria: un cop un agent es va inventar un fet legal, i per això tota dada porta la seva font o no hi entra.

# ejemplo real: revisión de un handoff entre sesiones $ /seed-review handoff.md agente CIEGO // no ve el plan → deriva el objetivo desde la fuente 2-4 críticos // en paralelo, mandato: REFUTAR crítico #1 ✗ una cifra no está respaldada por el repo crítico #2 ✗ el plan describe un estado desactualizado ciego ✎ probaba un proxy, no el objetivo real # arbitraje → EJECUTAR CON EDICIONES // se corrige antes de tocar nada
# real example: reviewing a handoff between sessions $ /seed-review handoff.md BLIND agent // never sees the plan → derives the goal from the source 2-4 critics // in parallel, mandate: REFUTE critic #1 ✗ a figure isn't backed by the repo critic #2 ✗ the plan describes a stale state blind ✎ it tested a proxy, not the real goal # arbitration → EXECUTE WITH EDITS // fixed before touching anything
# exemple real: revisió d'un handoff entre sessions $ /seed-review handoff.md agent CEC // no veu el pla → deriva l'objectiu des de la font 2-4 crítics // en paral·lel, mandat: REFUTAR crític #1 ✗ una xifra no està avalada pel repo crític #2 ✗ el pla descriu un estat desactualitzat cec ✎ provava un proxy, no l'objectiu real # arbitratge → EXECUTAR AMB EDICIONS // es corregeix abans de tocar res

La flota no es teoría: corre en cada handoff. Un agente ciego reconstruye el objetivo desde la fuente más upstream; varios críticos atacan con el mandato de refutar. Lo que cae, se corrige antes de tocar nada. Esta misma página pasó por ese filtro.

The fleet isn't theory: it runs on every handoff. A blind agent rebuilds the goal from the most upstream source; several critics attack, mandated to refute. What falls gets fixed before touching anything. This very page went through that filter.

La flota no és teoria: corre en cada handoff. Un agent cec reconstrueix l'objectiu des de la font més upstream; diversos crítics ataquen amb el mandat de refutar. El que cau, es corregeix abans de tocar res. Aquesta mateixa pàgina va passar per aquell filtre.

El límite, y cómo lo estrechoThe limit, and how I narrow itEl límit, i com l'estrenyo

Las lentes agénticas comparten los mismos priors: cazan falsos positivos, pero no el falso negativo de una medición mala o un requisito omitido: eso ninguna cantidad de agentes lo ve. Lo estrecho así: el gate humano (yo pruebo en el navegador cada fase) y convirtiendo cada punto ciego en una lente reutilizable. Por eso existe el registro de incidentes: cada fallo se promueve a una regla dura que la próxima sesión aplica sola, con un único escritor y un conjunto inmutable que ningún auto-proceso toca. Irreducible: la primera vez que aparece un sesgo nuevo, sigue haciendo falta un humano.

The agentic lenses share the same priors: they kill false positives, but not the false negative of a bad measurement or a missing requirement, no number of agents sees that. I narrow it like this: the human gate (I test every phase in the browser) and turning each blind spot into a reusable lens. That's why the incident ledger exists: every failure is promoted to a hard rule the next session applies on its own, with a single writer and an immutable set no auto-process touches. Irreducible: the first time a new bias appears, it still takes a human.

Les lents agèntiques comparteixen els mateixos priors: cacen falsos positius, però no el fals negatiu d'una mesura dolenta o un requisit omès: això cap quantitat d'agents ho veu. L'estrenyo així: el gate humà (jo provo al navegador cada fase) i convertint cada punt cec en una lent reutilitzable. Per això existeix el registre d'incidents: cada fallada es promou a una regla dura que la sessió següent aplica sola, amb un únic escriptor i un conjunt immutable que cap auto-procés toca. Irreductible: la primera vegada que apareix un biaix nou, encara cal un humà.

El resto del método (la refutación en lentes disjuntas, el invariante que vive en un solo sitio) es el mismo en los cinco sistemas y está contado una vez: en el índice.The rest of the method (refutation through disjoint lenses, the invariant that lives in one single place) is the same across all five systems and is told once: on the index.La resta del mètode (la refutació en lents disjuntes, l'invariant que viu en un sol lloc) és el mateix als cinc sistemes i està explicat una vegada: a l'índex.

Disponible para trabajarAvailable for workDisponible per treballar

Cojo un problema difuso y regulado, lo descompongo y orquesto IA para construir cada pieza, sin perder el rigor.

I take a fuzzy, regulated problem, break it down and orchestrate AI to build every piece, without losing the rigor.

Agafo un problema difús i regulat, el descomponc i orquestro IA per construir cada peça, sense perdre el rigor.

Si buscas a alguien para applied-AI, automatización o forward-deployed engineering, que no se engaña con sus propios resultados, hablemos.

If you're looking for someone in applied-AI, automation or forward-deployed engineering who doesn't fool themselves with their own results, let's talk.

Si busques algú per a applied-AI, automatització o forward-deployed engineering, que no s'enganya amb els seus propis resultats, parlem-ne.

SEKURA · Diego · 2026 Construido con IA · sin formación técnica previa · MVP (Stripe test)Built with AI · no prior technical background · MVP (Stripe test)Construït amb IA · sense formació tècnica prèvia · MVP (Stripe test)