Afirmaciones y mecanismos
Esta página enumera cada afirmación que hace Airframe sobre su seguridad, su costo y sus registros, con el mecanismo que respalda cada una y un estado honesto. Una afirmación vale lo que vale aquello que la hace cumplir, así que cada fila dice si algo rechaza hoy una infracción, si la afirmación depende de que las personas sigan una regla, o si está diseñada y todavía no construida. La página de límites de confianza explica cómo encajan las piezas.
Cómo leer una fila
Sección titulada «Cómo leer una fila»Cada fila tiene una afirmación, su mecanismo, un estado y una fuente: el repositorio y los archivos donde vive el mecanismo. El estado es una de tres palabras:
- Aplicado: un mecanismo rechaza la infracción. Para una afirmación de que la plataforma proporciona algo, como un panel, significa que el propio código de la plataforma lo proporciona siempre, sin que nadie lo elija.
- Convención: está escrito y se enseña, pero nada rechaza un cambio que lo ignore.
- Diseñado: especificado en el diseño o los registros de la plataforma, y no construido.
Los ejemplos vienen de una organización de demostración, cuyos proyectos están bajo una carpeta en Google Cloud. Hoy una sola persona opera la plataforma. Donde una fila nombra a una segunda persona, como quien aprueba, esa persona es la segunda cuenta del mantenedor: el mecanismo se aplica, pero la separación entre dos personas todavía no es real.
Cada afirmación de las páginas “por qué” aparece aquí con el mismo mecanismo, y también cada brecha que enumeran las propias revisiones y registros de la plataforma.
Identidades y acceso
Sección titulada «Identidades y acceso»Ninguna cuenta de uso diario de una persona tiene un rol permanente que pueda cambiar la infraestructura de producción.
- Mecanismo
- La raíz de carpetas y las fábricas de proyectos les dan a las personas roles de lectura y de lectura de registros, y la única escritura que tiene un equipo es agregar una versión de sus secretos de producción, nunca leer uno. Los roles administrativos llegan a las personas solo por concesiones de Privileged Access Manager. Un trabajo diario de Policy Analyzer falla, y alerta, si esa única cuenta de administrador tiene en el nodo de la organización algún rol que no sea Organization Administrator, o si cualquier otra persona o grupo tiene allí un rol permanente.
- Estado
- aplicado
- Fuente
- landing-zone
roots/folders/main.tf,roots/project-factory/,.gitlab-ci.yml(audit:policy-analyzer)
Solo un trabajo del propio repositorio del producto, en una rama o etiqueta protegida, en el entorno correcto, puede obtener su identidad de apply.
- Mecanismo
- La fábrica de proyectos vincula cada identidad de apply a un valor que combina la ruta del repositorio, el entorno y si la ref está protegida, solo con el valor protegido. El proveedor de identidades rechaza cualquier token de fuera del grupo projectairframe en GitLab.
- Estado
- aplicado
- Fuente
- landing-zone
roots/wif/main.tf,roots/project-factory/
Nada de lo que se ejecuta antes de un merge puede cambiar producción.
- Mecanismo
- El ejecutor puede usar la identidad de plan de cada producto, que lee y no cambia nada, y cada identidad de apply de no producción, y ninguna identidad de apply de producción. El pipeline propio de un merge request no recibe ninguna identidad.
- Estado
- aplicado
- Fuente
- landing-zone
roots/project-factory/(los permisos del ejecutor)
No se puede crear ni subir ninguna clave de cuenta de servicio bajo la carpeta de la organización de demostración.
- Mecanismo
- Las políticas de la organización en la carpeta desactivan la creación y la subida de claves para todo principal, y la política de denegación bloquea la creación de claves para todos menos el grupo de emergencia, la cuenta de administrador del arranque y el agente de servicio de Privileged Access Manager. El paquete de políticas también rechaza una clave declarada en Terraform.
- Estado
- aplicado
- Fuente
- landing-zone
roots/organisation/policies.tf,deny.tf; control-planepolicy/airframe/iam.rego
El acceso administrativo de un mantenedor es temporal, y lo aprueba otro miembro del grupo de la plataforma.
- Mecanismo
- Los derechos de Privileged Access Manager que dan roles administrativos duran como máximo dos horas y necesitan la aprobación de otro miembro del grupo de la plataforma; quien pide nunca aprueba su propia solicitud. Hoy ese miembro es la segunda cuenta del mantenedor.
- Estado
- aplicado
- Fuente
- landing-zone
roots/pam/main.tf
El proyecto de no producción de un producto facturado tiene una concesión de nivel 1, para leer sus registros y su estado durante una hora.
- Mecanismo
- El único derecho de nivel 1, de una hora y sin aprobador, está en el proyecto de no producción de la plataforma,
lk-runtime-np. Ninguna fábrica de proyectos crea uno para un producto todavía. - Estado
- diseñado
- Fuente
- landing-zone
roots/pam/variables.tf,docs/guides/identity.md
El propio Google Cloud rechaza los roles owner y editor en cualquier lugar bajo la carpeta, incluso fuera de un pipeline.
- Mecanismo
- Una restricción personalizada de la política de la organización, aplicada en la carpeta desde el 2026-10-01, rechaza una concesión de cualquiera de los dos roles por cualquier camino, la consola incluida. Admite dos casos: un proyecto todavía en la ventana de arranque de su fábrica, y el propio agente de servicio de las API de Google, al que Google le da editor cuando se activan las API de un proyecto. Las fábricas de proyectos además quitan el rol owner que Google les da en cada proyecto que crean. El paquete de políticas también rechaza los dos roles en cada cambio de Terraform (Políticas, más abajo).
- Estado
- aplicado
- Fuente
- landing-zone
roots/organisation/constraints.tf,terraform.tfvars,docs/adr/0026-the-floor-enforced-and-the-audit-record-locked.md
La política de denegación también protege la política de cortafuegos y Binary Authorization.
- Mecanismo
- La arquitectura 9.3 incluye las dos entre los permisos de la política de denegación. La política de denegación construida cubre la creación de claves, los cambios en las políticas de la organización, los cambios en el IAM de la carpeta y el sink de registros de la carpeta, y ninguna de las dos.
- Estado
- diseñado
- Fuente
- landing-zone
docs/architecture.md9.3,roots/organisation/deny.tf
Cada hostname de producto está detrás del inicio de sesión único.
- Mecanismo
- Identity-Aware Proxy está activo en cada servicio que atiende a usuarios, para el grupo de usuarios del producto: el módulo de Cloud Run del golden path lo activa en cada backend de producto, y el paquete de políticas rechaza un ingreso abierto, o un backend de producto, sin él. La verificación de invocador de Cloud Run sigue activa, con el agente de servicio de IAP como único invocador de un servicio del borde, así que se rechaza una llamada que rodee IAP. La compuerta de aprobación y este sitio web son las excepciones públicas de la plataforma. Una ruta que una entrada declara pública, con ingreso externo, está diseñada: nada la construye todavía.
- Estado
- aplicado
- Fuente
- control-plane
policy/airframe/cloud_run.rego; golden-pathmodules/cloud-run-service/main.tf; landing-zonedocs/contracts.md8
Las aplicaciones verifican el encabezado firmado que envía IAP, y la dirección predeterminada de un servicio está apagada.
- Mecanismo
- La revisión del 2026-09-25 registró las dos como las capas siguientes después de la verificación de invocador. Hoy solo la verificación de invocador impide que alguien rodee IAP: el módulo de Cloud Run del golden path la mantiene activa (
invoker_iam_disabled = false), y el paquete de políticas solo advierte cuando un servicio del borde la apaga. - Estado
- diseñado
- Fuente
- landing-zone
docs/reviews/2026-09-25-implementation-review.md(F06); control-planepolicy/airframe/cloud_run.rego
Cada vista previa tiene su propio hostname, detrás del inicio de sesión único, y ninguna otra entrada.
- Mecanismo
- El certificado y el registro comodín del dominio cubren cada hostname de vista previa, así que no se emite nada por vista previa. El módulo preview-substrate del golden path le da a cada producto un enrutador en su proyecto de no producción, detrás de IAP para el grupo de usuarios del producto; el enrutador lee el número del merge request en el hostname, y cada servicio de vista previa nombra al enrutador como su único invocador.
- Estado
- aplicado
- Fuente
- golden-path
modules/preview-substrate/
Un nombre eliminado nunca se reutiliza.
- Mecanismo
- El catálogo guarda una lápida por cada nombre retirado, y su lint rechaza cualquier otro producto con ese nombre en el dominio. Una identidad está vinculada a la ruta del repositorio, así que un repositorio nuevo no puede heredar el acceso de uno viejo.
- Estado
- aplicado
- Fuente
- catalog
scripts/lint.mjs,retired-names/
Control de cambios
Sección titulada «Control de cambios»El pipeline de un merge request no tiene ninguna credencial de la nube.
- Mecanismo
- Se ejecuta en el runner sin confianza, fuera de los perímetros, en una red sin ruta hacia los rangos de la plataforma; sus trabajos no pueden llegar al servidor de metadatos, y ninguna vinculación de identidad acepta una rama sin protección.
- Estado
- aplicado
- Fuente
- control-plane
roots/runner-untrusted/,docs/adr/0007-an-untrusted-runner-of-our-own.md; landing-zoneroots/wif/main.tf
Solo los responsables actuales pueden aprobar.
- Mecanismo
- La compuerta de aprobación lee el modelo de responsables desde la rama main protegida del catálogo, nunca desde el cambio que juzga, no cuenta ninguna aprobación del autor ni de quien hizo un commit, y vincula su propia aprobación al commit que revisó; una política de aprobación hace de esa aprobación una condición para el merge.
- Estado
- aplicado
- Fuente
- control-plane
gate/src/core/ownership.ts; security-policies.gitlab/security-policies/policy.yml
Solo la aprobación de una persona con nombre permite el merge de un cambio, nunca la de su autor.
- Mecanismo
- La política de aprobación enumera a sus aprobadores por nombre, las personas activas del catálogo con una cuenta de GitLab, y excluye al autor y a quienes hicieron commits. Un agente de código con su propia cuenta no está en ninguna lista; uno que actúa con la cuenta o el token de una persona es esa persona para GitLab, y nada distingue a los dos. La cuenta de servicio de la compuerta es la única aprobadora de otra política y no puede dar la aprobación de la persona. Hoy cada aprobador con nombre es una de las cuentas propias del mantenedor.
- Estado
- aplicado
- Fuente
- security-policies
.gitlab/security-policies/policy.yml
Cada archivo del catálogo se revisa antes del merge.
- Mecanismo
- El componente validate de control-plane ejecuta el lint del catálogo,
validate:catalog, en cada merge request y en main: cada archivo contra su JSON Schema, el padre de cada nivel presente, cada líder y cada miembro de un equipo una persona que no se ha ido, y el líder de cada equipo uno de sus miembros con el rol de líder de equipo. Cada hallazgo nombra su archivo. El proyecto del catálogo permite el merge de un merge request solo cuando su pipeline terminó con éxito, así que un hallazgo detiene el merge; en main, un lint fallido detiene la cadena de reconciliadores antes de que empiece. - Estado
- aplicado
- Fuente
- control-plane
templates/validate/template.yml(validate:catalog),roots/gitlab/projects.tf; catalogscripts/lint.mjs,schema/,.gitlab-ci.yml
Solo los responsables actuales pueden aprobar un cambio al catálogo.
- Mecanismo
- La compuerta de aprobación lee las reglas de responsables, los equipos y las personas de la rama main protegida del catálogo, nunca del cambio que evalúa, y cuenta solo a personas activas con una cuenta de GitLab, nunca al autor ni a los autores de sus commits. La política
required ownership gateen security-policies hace de la aprobación de la compuerta una condición para el merge en el catálogo, como en cada otro repositorio que la compuerta protege. - Estado
- aplicado
- Fuente
- control-plane
gate/src/core/ownership.ts,gate/src/adapters/gitlab-ownership.ts,gate/infra/terraform.tfvars(ownership_enforced); security-policies.gitlab/security-policies/policy.yml; catalogownership/protected-paths.yaml
Un merge al catálogo llega a los lectores sin que nadie ejecute un comando.
- Mecanismo
- El pipeline del catálogo en su rama main protegida dispara por turno los pipelines de landing-zone, operations y control-plane, y luego otra vez el de landing-zone, cada uno esperando al anterior; una falla detiene los que siguen. En ellos, el componente tf-apply ejecuta solo las raíces que declaran
reads_catalog, contra la rama main del catálogo, cada una con su propia identidad de pipeline. - Estado
- aplicado
- Fuente
- catalog
.gitlab-ci.yml(reconcile:landing-zone,reconcile:operations,reconcile:control-plane,reconcile:landing-zone-last); control-planetemplates/tf-apply/template.yml(reads_catalog,catalog_ref)
Cada lector deriva las membresías y las aprobaciones solo de personas activas.
- Mecanismo
- La raíz de grupos sincroniza membresías solo para personas activas; las raíces de GitLab dan membresías y derechos de merge solo a personas activas con un nombre de usuario de GitLab, y les dan acceso a los repositorios de la plataforma y a security-policies a través de un solo grupo,
projectairframe/contributors, así que una salida saca a la persona de todos ellos en la siguiente ejecución de la cadena; la raíz de Grafana agrega solo a personas activas con un nombre de usuario de Grafana; la compuerta de aprobación cuenta solo a personas activas. El lint rechaza a una persona que se fue en cualquier equipo o lista de líderes, así que el merge request que marca a alguien como departed también lo saca de cada equipo y cada lista de líderes. - Estado
- aplicado
- Fuente
- landing-zone
roots/groups/main.tf; control-planeroots/gitlab-config/locals.tf,roots/gitlab-config/memberships.tf,modules/product-repositories/main.tf,gate/src/core/ownership.ts; operationsroots/grafana/members.tf; catalogscripts/lint.mjs
Los aprobadores con nombre de la política de aprobación siguen al catálogo.
- Mecanismo
- El trabajo
policy:approverscompara la lista con las personas activas del catálogo con una cuenta de GitLab. En security-policies se ejecuta en cada merge request y en main, y un fallo se ve en el merge request. En control-plane se ejecuta después de cada merge al catálogo, donde una persona que hay que agregar o quitar solo genera una advertencia, así que la cadena del catálogo sigue, y cada día, donde falla ypolicy:approvers:reportmantiene un issue con el cambio exacto que hay que hacer. Un rol, un grupo o un id entre los aprobadores, o cualquier aprobador que no sea la cuenta de la compuerta en la regla de la propia compuerta, hace fallar todas las ejecuciones. Mientras la lista no se pone al día, una persona que todavía no figura en ella no puede aprobar, y una persona que se fue y sigue en ella no llega a ningún repositorio de la plataforma, porque las personas llegan a ellos solo a través del grupoprojectairframe/contributors, cuyos miembros salen del catálogo. Lo que sostiene la lista es la aprobación de cada cambio en security-policies por una persona con nombre, nunca su autor. - Estado
- convención
- Fuente
- security-policies
.gitlab-ci.yml(policy:approvers),scripts/approvers.py; control-planecli/approvers_lag.py,.gitlab-ci.yml(policy:approvers,policy:approvers:report),roots/gitlab-config/memberships.tf,roots/gitlab/modules/ultimate/policies.tf
La aprobación de la compuerta se exige en todos los repositorios menos uno.
- Mecanismo
- La política de la compuerta de responsables cubre los repositorios que la compuerta exige, hoy todos menos security-policies, que guarda las reglas de aprobación. Un repositorio nuevo se suma con dos merge requests, uno en control-plane y otro en security-policies; mientras tanto, solo necesita la aprobación de una persona con nombre.
- Estado
- aplicado
- Fuente
- security-policies
.gitlab/security-policies/policy.yml; control-planegate/
Un cambio todavía puede integrarse cuando la compuerta funciona pero no puede aprobarlo.
- Mecanismo
- Un merge request en security-policies, aprobado por una persona con nombre que no lo escribió, saca al repositorio bloqueado del alcance de la política de la compuerta, y un segundo lo vuelve a poner. Esto se ensayó: la regla dejó un repositorio de producto 11 segundos después del primer merge y volvió 35 segundos después de la reversión.
- Estado
- aplicado
- Fuente
- control-plane
docs/security-policies.md; security-policies.gitlab/security-policies/policy.yml
Un cambio en un repositorio de la plataforma todavía puede integrarse cuando no se puede llegar a la compuerta.
- Mecanismo
- security-policies está fuera de la política de ejecución de pipelines de todo el grupo, así que sus propios pipelines no llevan
gate:integrityy sus merge requests no esperan a la compuerta. Un merge request ahí, aprobado por una persona con nombre que no lo escribió, saca un repositorio del alcance de la políticarequired ownership gatey lo agrega a las exclusiones de esa política de ejecución; ese repositorio entonces integra solo con la aprobación de alguien que no es el autor, y un merge request inverso devuelve las dos. Durante la ventana el ejecutor no planifica, no construye ni promueve nada para él. El ensayo del 2026-10-02 sacó un repositorio de la plataforma y lo devolvió con la compuerta en funcionamiento: la regla salió en 10 segundos y volvió 16 segundos después del merge inverso. Luego dejó la compuerta inalcanzable durante dos minutos: un pipeline de otro repositorio falló de forma cerrada 10 segundos después de empezar, y el pipeline de security-policies pasó. El repositorio de un producto no puede integrar así, porque su merge también espera la verificación de estado Airframe cost, que solo fija la compuerta; no está decidido si un cambio urgente de un producto espera a la compuerta o tiene una salida por esa verificación. Lo que se pierde en una caída: GitLab no vuelve a enviar un evento de auditoría que la compuerta no pudo recibir. El 2026-10-02, 34 de los 35 pipelines del grupo que fallaron entre las 09:00 y las 15:30 UTC tienen su evento de fallo en el registro de la compuerta; el que no lo tiene falló durante la caída. Desde esa tarde un segundo destino de transmisión envía cada evento al receptor de auditoría, un servicio de Cloud Run aparte que ejecuta la imagen de la compuerta con solo la ruta de auditoría, así que el bucket de auditoría bloqueado pierde un evento solo cuando ninguno de los dos está disponible; las detecciones leen solo la copia de la compuerta, así que una caída de la compuerta sigue ocultándoles sus eventos. - Estado
- aplicado
- Fuente
- security-policies
.gitlab/security-policies/policy.yml; control-planedocs/adr/0032-a-gate-that-cannot-be-reached.md(pendientes 5 y 7),docs/security-policies.md; landing-zonedocs/rehearsals/2026-10-02-the-gate-unreachable.md; control-planegate/infra/audit-receiver.tf,docs/adr/0021-gitlab-ultimate-deployments-vulnerabilities-compliance-and-audit-events.md
Una caída de la compuerta se atiende con un procedimiento escrito, empezando por recuperar la propia compuerta.
- Mecanismo
- El ADR-0032 de control-plane fija dos etapas. Primero se recupera la compuerta en Google Cloud, porque no puede volver a desplegarse por su propio pipeline mientras está caída: con una concesión de nivel 2 de Privileged Access Manager que aprueba otro miembro del grupo de plataforma, el tráfico de Cloud Run vuelve a la última revisión que funcionó, unos 22 segundos en cada sentido en el ensayo. Solo si eso no restableció la compuerta en 30 minutos, y un cambio no puede esperar, un repositorio sale de los dos controles de la compuerta, por dos horas como máximo, como arriba. Las aprobaciones están aplicadas: Privileged Access Manager rechaza que quien pide apruebe su propia solicitud, y la política de aprobación rechaza la del autor. El orden, los 30 minutos y el issue que lleva la cronología están escritos y ensayados, y nada rechaza un merge request de emergencia que se los salte.
- Estado
- convención
- Fuente
- control-plane
docs/adr/0032-a-gate-that-cannot-be-reached.md; landing-zoneroots/pam/main.tf,docs/rehearsals/2026-10-02-the-gate-unreachable.md
Una ventana de emergencia para un repositorio termina a las dos horas.
- Mecanismo
- Nada la cierra: terminar la ventana es el merge request inverso de una persona. Quien verifica el límite es el pipeline programado de control-plane, que se ejecuta una vez al día, así que un exceso se ve en la ejecución del día siguiente.
breakglass:checkcompara el archivo de políticas de security-policies con el estado normal, avisa mientras una diferencia tiene menos de dos horas y falla después, con los repositorios nombrados, ybreakglass:reportmantiene abierto un issue con la etiquetaaudit::misconfigurationhasta que las políticas coinciden otra vez. - Estado
- convención
- Fuente
- control-plane
cli/breakglass_bound.py,.gitlab-ci.yml(breakglass:check,breakglass:report),docs/adr/0032-a-gate-that-cannot-be-reached.md
Ninguna variable de proyecto, de grupo o de pipeline puede apuntar el trabajo de integridad de la compuerta a otro lugar ni vaciarlo.
- Mecanismo
- El trabajo se ejecuta donde la política de todo el grupo lo inyecta: en cada repositorio menos security-policies y uno sacado para una ventana de emergencia. Define él mismo la dirección de la compuerta, y una dirección vacía falla de forma cerrada, como una compuerta inalcanzable. Las dos políticas de ejecución de pipelines no permiten anular variables, así que ninguna variable de proyecto, de grupo, de instancia ni de pipeline llega a los trabajos que inyectan. Hasta el 2026-10-02 el trabajo leía su dirección de una variable de grupo y registraba un pase cuando estaba vacía; ese respaldo ya no existe.
- Estado
- aplicado
- Fuente
- security-policies
templates/airframe.yml,.gitlab/security-policies/policy.yml; control-planedocs/adr/0032-a-gate-that-cannot-be-reached.md
Un producto se crea sin que nadie ejecute un comando.
- Mecanismo
- El pipeline del catálogo inicia la cadena de raíces de Terraform después del merge, y cada raíz se aplica con una identidad de pipeline que solo un trabajo de su propio repositorio, en una ref protegida de su entorno, puede obtener.
- Estado
- aplicado
- Fuente
- catalog
.gitlab-ci.yml; landing-zoneroots/wif/
Solo un cambio aprobado recibe una vista previa, y nunca con la identidad de producción.
- Mecanismo
- La compuerta de aprobación inicia la ejecución de vista previa del ejecutor solo cuando aprueba el merge request de un producto, y no para un producto en retiro; la ejecución aplica la raíz
infra/ephdel producto con la identidad de apply de no producción, después de que el paquete de políticas revisó el plan. Alguien que solo puede abrir merge requests no puede inflar la factura. - Estado
- aplicado
- Fuente
- control-plane
executor/scripts/preview.sh,docs/adr/0016-the-preview-lifecycle-through-the-executor.md
El merge request muestra cuánto avanzó el producto.
- Mecanismo
- Después del merge, el trabajo de progreso del catálogo sigue la cadena, y la compuerta de aprobación mantiene una nota en el merge request integrado hasta que el producto responde en su hostname, falla un trabajo o pasan tres horas.
- Estado
- aplicado
- Fuente
- control-plane
templates/progress/,gate/src/adapters/gitlab-progress.ts
Retirar un producto requiere dos aprobaciones además de la del autor.
- Mecanismo
- La regla de ciclo de vida de la compuerta pide dos aprobadores distintos, ninguno de ellos el autor: uno del equipo del producto y otro de los líderes del dominio o del equipo de la plataforma. El trabajo de ciclo de vida del catálogo exige la etiqueta lifecycle y los estados en orden. Hoy los dos pueden ser cuentas propias del mantenedor.
- Estado
- aplicado
- Fuente
- control-plane
gate/src/core/ownership.ts; catalogscripts/lifecycle-check.mjs
El Terraform de un producto no puede leer las credenciales del pipeline.
- Mecanismo
- Antes de cualquier plan, el ejecutor rechaza en la raíz de un producto toda función de plantilla y toda lectura de archivo que no sea un archivo que el commit trae o uno de un módulo fijado, y ejecuta el Terraform del producto como un usuario aparte, con un entorno limpio y un solo token. Esa segunda capa está probada en el pipeline y todavía no se ejerció con el plan real de un producto.
- Estado
- aplicado
- Fuente
- control-plane
executor/scripts/security.py,executor/scripts/worker.py,docs/adr/0028-a-products-terraform-runs-as-a-worker-with-one-token.md
Un producto no puede reclamar el nombre de host, el backend ni la identidad de otro producto en la red compartida.
- Mecanismo
- La raíz de red toma el dueño y la edición de cada publicación del nombre del objeto, compara con ellos cada afirmación que contiene, y rechaza por separado una publicación inválida o disputada: el nombre de host y el backend de una ruta, y la identidad de un alcance o de un objeto de salida, deben ser del dueño. Conservar la última configuración válida está pendiente.
- Estado
- aplicado
- Fuente
- landing-zone
docs/adr/0024-the-edge-publications-are-checked-against-their-owner.md,docs/reviews/2026-09-26-implementation-review.md(R02)
La dirección de un alcance pertenece a un servicio de su propio dueño.
- Mecanismo
- La raíz de red solo verifica que la dirección de un alcance esté en el rango de acceso a servicios privados de la red de la edición, no que sea la base de datos o la caché del propio dueño. Así, un producto puede abrir el camino de su propia identidad hacia la dirección de la base de datos o la caché de otro producto en ese rango, detrás de la autenticación propia de ese servicio. Una verificación del dueño de la dirección está pendiente.
- Estado
- diseñado
- Fuente
- landing-zone
docs/adr/0024-the-edge-publications-are-checked-against-their-owner.md,docs/reviews/2026-09-26-implementation-review.md(R02)
Una aprobación es un inicio de sesión nuevo, no una sesión.
- Mecanismo
- El diseño exige volver a autenticarse en cada aprobación. Está desactivado, un apartamiento registrado del diseño: mientras no esté activo, una aprobación dada con la sesión o el token de una persona cuenta como de esa persona.
- Estado
- diseñado
- Fuente
- landing-zone
docs/adaptations.md(fila 32); security-policies.gitlab/security-policies/policy.yml
Un producto de criticidad 1 se publica con verificación, un período de observación y un canario.
- Mecanismo
- Las criticidades 2 y 3 siguen el orden diseñado. La criticidad 1 toma el orden de la criticidad 2, porque el componente de despliegue de las etapas posteriores no está construido; la organización de demostración no tiene ningún producto de criticidad 1.
- Estado
- diseñado
- Fuente
- landing-zone
docs/adaptations.md(fila 48)
Un producto repartido en varios repositorios, cada uno desplegando su parte.
- Mecanismo
- El catálogo acepta los repositorios de una entrada y los contratos nombran su estado, sus identidades y sus hostnames, pero nada los lee todavía, y la decisión de diseño sigue siendo una propuesta.
- Estado
- diseñado
- Fuente
- landing-zone
docs/adr/0017-multi-repository-products-and-adoption-by-moving-the-group.md
Políticas
Sección titulada «Políticas»Las pruebas del paquete de políticas se ejecutan con cada cambio en él.
- Mecanismo
- El trabajo
policy:testde control-plane ejecuta las pruebas unitarias de Conftest y los casos que deben pasar y fallar en cada merge request que cambia el paquete, y GitLab solo integra un merge request cuyo pipeline termina bien. - Estado
- aplicado
- Fuente
- control-plane
.gitlab-ci.yml(policy:test),policy/airframe/
Cada regla trae un caso que debe aceptar y otro que debe rechazar.
- Mecanismo
- Las convenciones de trabajo y la documentación del paquete piden los dos. La revisión lo sostiene; ningún trabajo verifica que una regla nueva traiga sus pruebas.
- Estado
- convención
- Fuente
- control-plane
docs/policy-pack.md
El repositorio de un producto no puede saltarse la validación.
- Mecanismo
- La política de ejecución de pipelines de producto inyecta los componentes validate y build-test en cada pipeline de los repositorios de los grupos de recorrido, y GitLab no deja que el archivo propio de ningún proyecto quite o reemplace un trabajo inyectado.
- Estado
- aplicado
- Fuente
- security-policies
.gitlab/security-policies/policy.yml,templates/product.yml
El archivo de pipeline de un producto incluye solo los componentes de la plataforma, y ninguno de sus propios trabajos despliega.
- Mecanismo
- Las reglas de pipeline del paquete rechazan una inclusión que no sea uno de los ocho componentes con nombre de control-plane, un trabajo que declara un entorno y un trabajo que dispara otro pipeline; la validación inyectada las ejecuta sobre el archivo del producto.
- Estado
- aplicado
- Fuente
- control-plane
policy/airframe/pipeline.rego,docs/adr/0026-a-product-job-never-deploys.md
Una regla que rechaza detiene el cambio.
- Mecanismo
- Un rechazo hace fallar el trabajo de validación inyectado, y GitLab integra el merge request de un producto solo cuando su pipeline termina bien. En main,
policy:<root>ejecuta el paquete sobre el plan, y el apply necesita que pase. Las reglas de costo se ejecutan en el ejecutor y deciden la verificación de estado Airframe cost. - Estado
- aplicado
- Fuente
- control-plane
templates/validate/template.yml,templates/tf-apply/template.yml
Una advertencia necesita la aprobación de la plataforma y una fila en el registro de excepciones.
- Mecanismo
- Hoy una advertencia aparece en el registro del trabajo y no detiene nada: Conftest se ejecuta sin fallar por advertencias, aunque la documentación del paquete y algunos mensajes dicen que hace falta una aprobación.
- Estado
- diseñado
- Fuente
- control-plane
docs/policy-pack.md,templates/validate/template.yml
Una regla nueva de rechazo pasa una versión de la plataforma como advertencia, y después rechaza.
- Mecanismo
- Las convenciones de trabajo lo piden, y nada convierte una advertencia en rechazo. Varias reglas marcadas como advertencias por una versión, como las reglas de la base de datos sidecar, la verificación de invocador del borde y las inclusiones obligatorias del archivo de un producto, siguen siendo advertencias en la versión 2026.10.01-1.
- Estado
- convención
- Fuente
- control-plane
policy/airframe/cloud_run.rego,pipeline.rego,docs/policy-pack.md
Los recursos propios se permiten, con una advertencia.
- Mecanismo
- El paquete advierte sobre cada recurso administrado que la raíz de un producto declara fuera de un módulo, y pide una razón en el merge request; una advertencia no hace fallar nada. Sus reglas de rechazo se aplican a todo recurso, propio o no, y los tipos que son de la plataforma, como redes, proyectos y perímetros, se rechazan en la raíz de un producto.
- Estado
- aplicado
- Fuente
- control-plane
policy/airframe/naming.rego,platform_owned.rego
Ningún cambio de Terraform da el rol owner o editor, ni nada al público.
- Mecanismo
- Las reglas de IAM del paquete rechazan owner y editor en cualquier forma, y cualquier permiso a
allUsersoallAuthenticatedUsers, en el código y en el plan. - Estado
- aplicado
- Fuente
- control-plane
policy/airframe/iam.rego
Cada recurso etiquetado lleva el conjunto completo de etiquetas de la plataforma.
- Mecanismo
- La regla de etiquetas rechaza un recurso al que le falte cualquiera de las seis que nombran los contratos, en el código y en el plan.
- Estado
- aplicado
- Fuente
- control-plane
policy/airframe/naming.rego; landing-zonedocs/contracts.md7
Cada recurso lleva las etiquetas de la plataforma, incluso uno que no declara ninguna.
- Mecanismo
- Los contratos piden etiquetas en cada proyecto y recurso. La regla de etiquetas revisa las etiquetas que un recurso declara, así que un recurso sin ningún atributo de etiquetas la pasa.
- Estado
- diseñado
- Fuente
- landing-zone
docs/contracts.md7; control-planepolicy/airframe/naming.rego
La laptop ejecuta la validación del merge request.
- Mecanismo
airframe validateejecuta los comandos de formato, terraform validate y paquete de políticas del componente validate, sin backend y sin credenciales; OpenTofu y tflint se ejecutan solo donde están instalados. Ejecutarlo es una convención, y el merge request ejecuta las verificaciones de todos modos. Lee el paquete del clon de control-plane desde el que se instaló, no de la versión de la plataforma del producto, y no ejecuta el lint del catálogo, la compuerta, las pruebas de la aplicación, el plan ni su precio; donde están Infracost y su clave, muestra una estimación a partir del código.- Estado
- convención
- Fuente
- control-plane
cli/airframe-validate.sh
airframe validate ejecuta las pruebas de módulos, el lint de las especificaciones de API y la verificación de compatibilidad de API.
- Mecanismo
- Las convenciones de trabajo del espacio de trabajo enumeran las tres; el script no ejecuta ninguna.
- Estado
- diseñado
- Fuente
- control-plane
cli/airframe-validate.sh
Cadena de suministro
Sección titulada «Cadena de suministro»Su propio Dockerfile se construye sobre una imagen base de la plataforma.
- Mecanismo
- Las reglas de Dockerfile del paquete rechazan un
FROMo unCOPY --fromfuera de las imágenes base de la plataforma, uno sin fijar y uno calculado a partir de un argumento de compilación, en los Dockerfiles que enumera.airframe/images.yaml. Desde la versión 2026.10.01-1, la validación inyectada las ejecuta en cada merge request que cambia un Dockerfile enumerado llamadoDockerfile,Dockerfile.*,*.Dockerfileo*.dockerfile, yairframe validatelas ejecuta en la máquina local. El constructor de confianza construye y atesta exactamente esa lista. - Estado
- aplicado
- Fuente
- control-plane
policy/airframe/dockerfile.rego,templates/validate/template.yml
Un merge request que cambia solo un Dockerfile enumerado se juzga, sea cual sea su nombre.
- Mecanismo
- Un Dockerfile enumerado con otro nombre, como
Containerfile, se juzga solo cuando el merge request también cambia otro archivo que la validación vigila. - Estado
- diseñado
- Fuente
- control-plane
templates/validate/template.yml,docs/adr/0014-approved-base-images-built-in-project-and-checked-on-every-from.md
Cada stack se construye y se prueba cuando cambia su parte de la plantilla.
- Mecanismo
- El pipeline de golden-path vuelve a generar los tres ejemplos y exige que coincidan con los guardados cada vez que cambia la plantilla, y construye y prueba el ejemplo de un stack cuando cambian los archivos de ese stack. El catálogo de demostración tiene un producto activo en cada stack.
- Estado
- aplicado
- Fuente
- golden-path
.gitlab-ci.yml(template:render,template:test)
Un stack que la plantilla no ofrece se construye sobre una imagen base de la plataforma, sin las pruebas de la plataforma.
- Mecanismo
- Las reglas de imagen base se aplican a cada Dockerfile enumerado. Los trabajos inyectados de compilación y pruebas conocen solo los tres stacks de la plantilla, así que otro stack no ejecuta ninguno y no pasa el umbral de cobertura hasta que su entrada baje
quality.minimum_coverage. - Estado
- aplicado
- Fuente
- control-plane
templates/build-test/template.yml
Un servicio de producto desplegado con el golden path ejecuta solo una imagen que la plataforma construyó y promovió.
- Mecanismo
- El módulo de Cloud Run del golden path adhiere cada servicio a la política de Binary Authorization de su proyecto, que en el proyecto de producción de un producto facturado se aplica y exige las atestaciones de compilación y de promoción; la raíz trusted-builder deja firmar solo a la identidad que firma las compilaciones y al promotor de artefactos.
- Estado
- aplicado
- Fuente
- golden-path
modules/service-project/main.tf,modules/cloud-run-service/main.tf; control-planeroots/trusted-builder/
Binary Authorization rige para cada servicio de Cloud Run, como parte de la base.
- Mecanismo
- La arquitectura 9.3 la cuenta entre los controles que se sostienen si se elude un pipeline. Lo construido es una adhesión por servicio, escrita solo para productos facturados: ninguna política de la organización exige que un servicio se adhiera, un servicio de Cloud Run propio pasa el paquete con una advertencia, y la puerta de enlace de telemetría de la plataforma se ejecuta sin ella.
- Estado
- diseñado
- Fuente
- landing-zone
docs/architecture.md9.3,roots/organisation/policies.tf; golden-pathmodules/cloud-run-service/main.tf
Cada imagen se analiza en busca de vulnerabilidades conocidas en la compilación de confianza.
- Mecanismo
- El constructor de confianza ejecuta grype sobre cada imagen que construye, con una base de datos de vulnerabilidades que la plataforma prepara una vez al día y que solo usa si tiene como máximo 48 horas y coincide con su suma de verificación; si no, grype descarga la base de datos del proveedor para esa compilación. El análisis y la lista de materiales de software de la imagen se guardan junto al digest de la imagen como evidencia, con constancia de qué base de datos se usó, y los hallazgos llegan al informe de vulnerabilidades de GitLab en la promoción. Un hallazgo avisa: no bloquea un despliegue.
- Estado
- aplicado
- Fuente
- control-plane
executor/build/cloudbuild.yaml,docs/adr/0034-the-scan-database-prepared-once-a-day.md,docs/adr/0021-gitlab-ultimate-deployments-vulnerabilities-compliance-and-audit-events.md
La atestación de compilación se firma aparte de la compilación.
- Mecanismo
- El constructor de confianza construye y analiza;
build-attestor@, que solo el ejecutor puede suplantar, firma la atestación de compilación después de que el ejecutor comparó la compilación con el registro propio de Cloud Build. La promoción a producción agrega una segunda atestación. - Estado
- aplicado
- Fuente
- control-plane
roots/trusted-builder/main.tf,docs/adr/0029-the-build-attestation-is-signed-apart-from-the-build.md
Cada imagen se vuelve a analizar, aparte de la compilación.
- Mecanismo
- El análisis del constructor se ejecuta dentro de la compilación, y su resultado llega al informe de vulnerabilidades de GitLab en la promoción. Un análisis independiente de cada digest fuera de la compilación figura como pendiente.
- Estado
- diseñado
- Fuente
- landing-zone
docs/reviews/2026-09-26-implementation-review.md(R03)
Una versión de la plataforma revocada no ejecuta ningún pipeline nuevo.
- Mecanismo
- El trabajo de integridad de la compuerta, que la política de ejecución de pipelines del grupo inyecta en cada pipeline, lee las versiones permitidas en la rama main de control-plane y hace fallar un pipeline que incluye una revocada; el ejecutor hace la misma verificación antes de que una ejecución de merge request o de versión tenga las credenciales de un producto.
- Estado
- aplicado
- Fuente
- control-plane
gate/src/core/releases.ts,executor/scripts/release_check.py,releases/permitted.yaml
Una versión de la plataforma es un conjunto fijo de commits, verificados juntos.
- Mecanismo
- Una versión es un manifiesto del commit de cada parte, que no cambia una vez integrado, verificado en esos commits antes de permitirse; un componente obtiene su paquete de políticas en su propio commit y nombra cada imagen por digest. Un archivo de pipeline que incluye un componente por rama o etiqueta recibe una advertencia, no un rechazo.
- Estado
- aplicado
- Fuente
- control-plane
releases/,docs/adr/0030-shared-references-are-pinned-to-commits-and-digests.md,docs/adr/0031-the-platform-release-a-manifest-and-a-permitted-list.md
Un cambio por encima del presupuesto no puede integrarse.
- Mecanismo
- La compuerta de aprobación define la verificación de estado Airframe cost de cada merge request de producto a partir de los planes con precio del ejecutor de cada raíz en su último commit: falla cuando el total de las raíces o cualquier raíz supera el
monthly_budgetde la entrada, o cuando una raíz no tiene precio. La regla del proyecto del producto exige que las verificaciones de estado pasen. Un plan en main también se detiene ante un rechazo registrado. Las vistas previas y los recursos por uso quedan fuera de la cifra. - Estado
- aplicado
- Fuente
- control-plane
gate/src/adapters/gitlab-status-checks.ts,executor/scripts/cost.sh,docs/adr/0025-the-merge-waits-for-the-cost-verdict.md
Subir un presupuesto requiere a un líder del dominio.
- Mecanismo
- La regla de responsables de la compuerta exige la aprobación de un líder del dominio para un cambio del catálogo que sube
monthly_budget; donde los líderes del dominio no tienen cuenta de GitLab, como en la demostración, el equipo de la plataforma los reemplaza. - Estado
- aplicado
- Fuente
- control-plane
gate/src/core/ownership.ts
Cada producto tiene un panel de costo frente a su presupuesto.
- Mecanismo
- La raíz de Grafana de operations, que se ejecuta cuando cambia el catálogo, crea un panel de costo en la carpeta de cada producto: el mes en curso y la proyección frente a
monthly_budget, naranja al 80 por ciento y rojo al 100, desde la exportación de facturación a través del trabajo diariocost:report. - Estado
- aplicado
- Fuente
- operations
roots/grafana/pack.tf,roots/cost/
Los presupuestos de Google Cloud siguen la misma cifra.
- Mecanismo
- La fábrica de proyectos del dominio crea un presupuesto en cada proyecto de producto facturado a partir de
monthly_budget, 70 por ciento para producción y 30 para no producción, con alertas al 80 y al 100 por ciento. Ningún producto de demostración está facturado hoy, así que ninguno tiene todavía los presupuestos de sus proyectos. - Estado
- aplicado
- Fuente
- landing-zone
roots/project-factory/
Una alerta de presupuesto llega al equipo del producto.
- Mecanismo
- Cuando un producto está facturado, las alertas de sus presupuestos van por correo a los administradores y usuarios de la cuenta de facturación, lo predeterminado de Google, no al equipo.
- Estado
- diseñado
- Fuente
- landing-zone
roots/project-factory/
Un aumento de costo de más de USD 10 o del 25 por ciento al mes necesita la aprobación de la plataforma.
- Mecanismo
- Hoy ese aumento es una advertencia en la nota de la raíz en el merge request y no detiene nada.
- Estado
- diseñado
- Fuente
- control-plane
policy/airframe/cost.rego
Una vista previa se destruye cuando termina su merge request.
- Mecanismo
- La compuerta de aprobación se entera del merge o del cierre por el webhook de GitLab e inicia la ejecución de destrucción del ejecutor, que verifica por sí misma el estado del merge request. El registro de cada vista previa tiene un bloqueo, así que un apply y una destrucción nunca se ejecutan a la vez, y un merge request reabierto empieza una nueva generación, así que una destrucción tardía no puede quitar la vista previa nueva.
- Estado
- aplicado
- Fuente
- control-plane
executor/scripts/preview.sh,executor/scripts/preview_record.py
Una vista previa vencida u olvidada se recoge.
- Mecanismo
preview:collect, en el pipeline programado diario de control-plane, enumera las vistas previas que según los registros del ejecutor siguen activas y destruye las integradas, las cerradas y las que pasaronpreview_ttl_hours(72 por defecto, como máximo 168, contadas desde el último apply), con una nota en cada merge request.- Estado
- aplicado
- Fuente
- control-plane
executor/scripts/preview.sh
Una vista previa casi no cuesta nada mientras está inactiva, y nunca bloquea un merge.
- Mecanismo
- El enrutador y los servicios de la vista previa escalan a cero, la base de datos sidecar predeterminada vive en la propia revisión del servicio, y el módulo de Cloud Run del golden path ejecuta el servicio de una vista previa con una instancia como máximo. El ejecutor pone precio al plan de cada vista previa y lo muestra en su nota, y la verificación de costo que retiene un merge deja fuera las vistas previas.
- Estado
- aplicado
- Fuente
- golden-path
modules/preview-substrate/,modules/cloud-run-service/; control-planeexecutor/scripts/preview.sh
Auditoría y observabilidad
Sección titulada «Auditoría y observabilidad»Cada concesión, y cada cambio hecho con ella, queda registrado.
- Mecanismo
- Privileged Access Manager guarda cada concesión con quien la pidió, la justificación, quien la aprobó y su motivo, y el registro de auditoría de Google Cloud guarda cada cambio; los registros de Data Access en la carpeta también guardan las lecturas de Secret Manager, Cloud SQL, Cloud Storage, IAM y Cloud KMS.
- Estado
- aplicado
- Fuente
- landing-zone
roots/pam/,roots/audit/main.tf
Cada uso de una concesión tiene una fila en el registro del arranque.
- Mecanismo
- La fila nombra la concesión, quién la pidió y quién la aprobó, la raíz y el commit aplicados, y el plan vacío posterior. Está escrito y se enseña; nada rechaza una concesión sin fila.
- Estado
- convención
- Fuente
- landing-zone
docs/bootstrap-log.md
Cada registro de auditoría de Google Cloud llega a un solo bucket, y ningún pipeline puede desviarlo.
- Mecanismo
- Un sink agregado en la carpeta envía los registros de auditoría de cada proyecto, y los eventos de auditoría de GitLab a través de la compuerta y el receptor de auditoría, a un bucket en
lk-auditcifrado con una clave que tiene la plataforma. La política de denegación rechaza cualquier cambio en un sink de la carpeta a todos menos el grupo de emergencia, la cuenta de administrador del arranque y el agente de servicio de Privileged Access Manager. La política de IAM de la carpeta, que guarda la configuración de auditoría, tiene las mismas excepciones y una cuarta, la identidad que configura las concesiones; esa identidad actúa solo desde código revisado, y la condición sobre su acceso exige que un cambio modifique al menos una concesión y solo de los roles que dan los derechos, así que una llamada que cambia únicamente la configuración de auditoría se rechaza. Una llamada que cambia a la vez una concesión permitida y la configuración de auditoría todavía pasa: en la carpeta, una regla de Grafana avisa cuando cambia una configuración de auditoría, y en la organización no hay sink. El sink deja fuera las entradas de prueba de VPC Service Controls, que registran lo que un perímetro habría rechazado y no un rechazo; el registro propio de cada proyecto las conserva. Los eventos de auditoría de GitLab llegan al bucket por dos destinos de transmisión, la compuerta y el receptor de auditoría, y cada uno escribe todos los eventos; GitLab no vuelve a enviar un evento, así que un evento creado mientras ninguno de los dos está disponible falta en el bucket, y si su tipo es de los que GitLab solo transmite no se registra en ningún lugar. - Estado
- aplicado
- Fuente
- landing-zone
roots/audit/main.tf,roots/organisation/deny.tf,roots/wif/grants.tf,docs/adr/0007-pam-companion-condition.md; operationsroots/grafana/detections.tf; control-planedocs/adr/0032-a-gate-that-cannot-be-reached.md(pendiente 7),gate/infra/audit-receiver.tf
La retención del bucket de auditoría está bloqueada.
- Mecanismo
- Una política de retención guarda cada objeto durante 365 días, y ninguno se puede borrar ni sobrescribir antes. La política está bloqueada desde el 2026-10-01, lo que Google hace irreversible: nadie, ni un administrador con una concesión, puede acortarla ni quitarla, y el proyecto de auditoría no se puede borrar mientras el bucket tenga objetos.
- Estado
- aplicado
- Fuente
- landing-zone
roots/audit/main.tf,roots/audit/terraform.tfvars,docs/bootstrap-log.md
Los datos no pueden salir de los proyectos de la plataforma por las API de Google, ni siquiera con credenciales válidas.
- Mecanismo
- Tres perímetros de VPC Service Controls, de producción, no producción y auditoría, se aplican como especificaciones en modo de prueba: una posible infracción se registra, y no se bloquea nada. Aplicarlos es una variable. Las lecturas diarias de la raíz de la organización que un perímetro rechazaría vienen de dentro del perímetro de producción, del runner de confianza en la VPC de la red de producción, porque la lista de servicios alcanzables desde esa VPC no los incluye; no son llamadas desde fuera.
- Estado
- diseñado
- Fuente
- landing-zone
roots/perimeters/
Un uso sospechoso genera una alerta: un intento de crear una clave, un rechazo de la política de denegación, una concesión, una identidad usada fuera de su pipeline.
- Mecanismo
- Un segundo sink, estrecho, en la carpeta envía solo estas entradas a Loki: un intento de crear una clave, un rechazo de una política de denegación o de la organización, un token rechazado, un cambio en los sinks, las políticas de denegación o la configuración de auditoría de la carpeta, una concesión, y los eventos de auditoría de GitLab. Reglas en Grafana avisan con urgencia a la plataforma por los cinco primeros y abren un ticket por una concesión o una ráfaga de cambios en GitLab. Un evento en la propia organización, como una concesión a nivel de organización, queda fuera de los sinks de la carpeta; la notificación al aprobador es su único registro además del registro de auditoría. Los eventos de GitLab llegan a través de la compuerta, así que los creados mientras no se puede llegar a ella nunca llegan, y ninguna regla los ve.
- Estado
- aplicado
- Fuente
- landing-zone
roots/audit/main.tf,docs/adr/0027-the-audit-detections-alert-in-grafana.md; operationsroots/grafana/detections.tf
La deriva se informa.
- Mecanismo
- El trabajo de deriva del componente tf-apply planifica cada raíz con la programación diaria del repositorio, y el componente drift-report, como la identidad de auditoría, mantiene un issue con la etiqueta
audit::driftpor cada raíz con deriva, lo reescribe y lo cierra cuando el plan vuelve a estar vacío. - Estado
- aplicado
- Fuente
- control-plane
templates/tf-apply/,templates/drift-report/
El trabajo de un agente de código queda etiquetado.
- Mecanismo
- Las instrucciones para un agente de código y el skill airframe-platform piden un trailer
Generated-byen cada commit y la etiquetaagenten el merge request, y la configuración de GitLab de la plataforma define la etiqueta. Ningún trabajo ni regla verifica ninguno de los dos, así que registran lo que declara un agente de código o su usuario. - Estado
- convención
- Fuente
- golden-path
template/; platform-skillsskills/
Una auditoría puede distinguir el trabajo de un agente de código del de una persona, y medir su parte.
- Mecanismo
- Para eso están diseñados el trailer y la etiqueta; como nada los verifica, hoy no pueden demostrarlo.
- Estado
- diseñado
- Fuente
- landing-zone
docs/architecture.md9.7
Cada producto tiene sus paneles y reglas de alerta a partir de su entrada.
- Mecanismo
- La raíz de Grafana de operations, que se ejecuta cuando cambia el catálogo, crea la carpeta de cada producto, sus paneles de servicio y de SLO y sus reglas de alerta básicas, con umbrales tomados del
slode la entrada; las reglas seleccionan producción por la etiquetaenv, y una serie que falta no es una alerta. - Estado
- aplicado
- Fuente
- operations
roots/grafana/pack.tf,alerts.tf
Una alerta llega al equipo del producto, y hoy eso significa al mantenedor.
- Mecanismo
- Cada regla se enruta por la etiqueta del equipo hacia el punto de contacto del equipo, que envía correo a los miembros del equipo con cuenta de Grafana, y un aviso urgente se repite cada cuatro horas hasta que se resuelve. Grafana Cloud acepta solo las direcciones de sus propios miembros, y hoy esos miembros son las cuentas propias del mantenedor, así que las alertas de cada equipo, y las de la plataforma, le llegan al mantenedor.
- Estado
- aplicado
- Fuente
- operations
roots/grafana/alerts.tf,members.tf
Una aplicación no necesita configuración y no tiene ninguna credencial de Grafana.
- Mecanismo
- La salida Ready de la fábrica de proyectos trae la dirección de la puerta de enlace de la edición del producto, y el módulo de Cloud Run del golden path la inyecta en cada servicio. Las trazas y las métricas llegan a la puerta de enlace OTLP con el token de identidad del servicio; los registros llegan a la puerta de enlace de registros por el sink del proyecto y un buffer de Pub/Sub. Las puertas de enlace tienen el token de solo escritura de la edición, la única credencial de Grafana de ese lado.
- Estado
- aplicado
- Fuente
- operations
roots/telemetry/; golden-pathmodules/cloud-run-service/main.tf
Cada señal dice de qué edición vino.
- Mecanismo
- La puerta de enlace OTLP conserva el
envde una señal solo cuando es válido para su propia edición y reemplaza un valor faltante o ajeno porunknown; la puerta de enlace de registros conserva unenvválido y, si no, le da a la línea el de su perímetro, así que solo las entradas de auditoría quedan enunknown. Las dos marcan la edición comoperimeter. El módulo de Cloud Run del golden path les da a las trazas y las métricas de un servicio su nombre de servicio, su dominio y su entorno, y el agente de la plataforma etiqueta las métricas de recursos de Cloud de cada proyecto de producto facturado con la ruta del producto y su recorrido y dominio. - Estado
- aplicado
- Fuente
- operations
roots/telemetry/config/
Las señales de una aplicación, las métricas de recursos del agente de la plataforma y las series de las tareas programadas de la plataforma llevan el entorno del que vinieron.
- Mecanismo
- La puerta de enlace OTLP le da a un recurso sin
envel valor dedeployment.environment.namey, si falta, el dedeployment.environment, el atributo que el módulo de Cloud Run del golden path fija a partir del despliegue (prod,np,sandboxoeph-<n>); un punto de datos conserva su propioenvválido, y un valor que no es válido para la edición pasa aunknown. El agente de la plataforma etiqueta conenvlas series de cada proyecto:platformpara los proyectos de la plataforma, la edición para los de un producto, y en no producción el nombre del servicio de Cloud Run lo reduce asandboxoeph-<n>. La puerta de enlace de registros le da a una línea sin unenvválido el de su perímetro, reducido de la misma manera; las líneas de un proyecto de la plataforma sonplatform, y las entradas de auditoría conservanunknown. Las propias tareas programadas de la plataforma (los informes de costos, de entrega y de cobertura y la comprobación diaria de Policy Analyzer) declarandeployment.environment=platformen su recurso, así que sus series llevanenvplatform; el informe de costos guarda el entorno del proyecto al que pertenece un costo en una etiqueta aparte,project_env(sección 7 de los contratos). Las series del informe de deriva siguen llegando comounknownhasta la próxima versión de la plataforma, porque cada repositorio ejecuta el componente drift-report de su versión. El pipeline aplica la raíz de telemetría desde la rama main de operations, y su trabajotelemetry:testgenera las configuraciones reales y las ejecuta en el Alloy fijado cada vez que cambian, y falla en lugar de omitirse cuando falta el binario. - Estado
- aplicado
- Fuente
- operations commit
872681a:roots/telemetry/config/otlp.alloy.tftpl,logs.alloy.tftpl,agent.alloy.tftpl,roots/telemetry/agent.tf,tests/telemetry_test.py,.gitlab-ci.yml,jobs/delivery_report.py,jobs/coverage-report.sh,jobs/cost_report.py; control-planetemplates/drift-report/template.yml; landing-zone.gitlab-ci.yml,docs/contracts.md7; golden-pathmodules/airframe-context/main.tf,modules/cloud-run-service/main.tf
Las señales de una aplicación llevan su equipo y su criticidad.
- Mecanismo
- El diseño le da a cada señal las etiquetas del catálogo, entre ellas el equipo y la criticidad. Hoy no llevan ninguna etiqueta así: las trazas y las métricas de un servicio tienen
service.name,service.namespace, que es su dominio, ydeployment.environment, y la puerta de enlace de registros conserva el proyecto, el servicio, el tipo de recurso, el nombre del registro y la severidad de una línea. Solo algunas series de la propia plataforma llevan un equipo, como las de los informes de entregas y de cobertura. - Estado
- diseñado
- Fuente
- landing-zone
docs/guides/observability.md(Labels); golden-pathmodules/cloud-run-service/main.tf; operationsroots/telemetry/config/logs.alloy.tftpl
Una alerta avisa a una persona de guardia, con una programación y una cadena de escalamiento.
- Mecanismo
- La herramienta de guardias e incidentes de Grafana tendría las dos para cada equipo, a partir del catálogo. Hoy una alerta es un correo.
- Estado
- diseñado
- Fuente
- landing-zone
docs/architecture.md13.5
Una caída de la compuerta se nota sin esperar a los pipelines en rojo.
- Mecanismo
- Una verificación HTTP de Synthetic Monitoring de Grafana Cloud,
airframe-gate, consultahttps://gate.projectairframe.dev/healthcada 60 segundos desde dos sondas. Una regla del grupoairframe-platformavisa al punto de contacto de la plataforma cuando más de una sonda falla durante dos minutos, o cuando la verificación no informa nada. La verificación cubre solo la compuerta; ningún otro hostname tiene una. Hoy un aviso es un correo al mantenedor. - Estado
- aplicado
- Fuente
- operations
roots/grafana/synthetic.tf,alerts.tf,docs/adr/0012-the-gate-uptime-check-in-synthetic-monitoring.md
La base de alertas cubre cada falla que nombra el diseño.
- Mecanismo
- Cloud Run en su máximo de instancias, los reinicios o la falta de memoria, una verificación de contrato bloqueada en main, y las verificaciones de disponibilidad a través del hostname de producción de cada producto están diseñadas; la raíz de Grafana todavía no crea esas reglas. La verificación de disponibilidad de la compuerta, arriba, es la única construida.
- Estado
- diseñado
- Fuente
- landing-zone
docs/architecture.md13.4, 13.6; operationsroots/grafana/pack.tf
Un agente de operaciones investiga una alerta, y un agente de auditoría busca desperdicio y huérfanos.
- Mecanismo
- El primero actuaría dentro de lo que permite el
agentic_opsde la entrada; el segundo miraría toda la organización, y encontraría una vista previa sin registro o una destrucción fallida. Ninguno existe hoy. - Estado
- diseñado
- Fuente
- landing-zone
docs/architecture.md14.3
Documentación
Sección titulada «Documentación»Un skill dice lo que hacen las verificaciones de la plataforma.
- Mecanismo
- Los trabajos
skills:policy,skills:validate,skills:catalogyskills:referencesdel pipeline de platform-skills verifican los ejemplos de cada skill contra el paquete de políticas en el commit de control-plane que fijan los skills, terraform validate y el lint del catálogo, y verifican las rutas que nombra un skill; GitLab integra un cambio solo cuando pasan. Elrelease:checkde control-plane exige que esa fijación sea la de la versión de la plataforma. Si un agente de código carga un skill depende del agente y de su usuario. - Estado
- aplicado
- Fuente
- platform-skills
.gitlab-ci.yml; control-plane.gitlab-ci.yml(release:check)
Cada skill trae ejemplos que las verificaciones deben aceptar o rechazar.
- Mecanismo
- El README de platform-skills dice que cada skill viene con sus pruebas y que un skill sin pruebas no se integra, y cuatro de los cinco skills traen ejemplos que deben pasar y fallar. El skill de visión general, airframe-platform, no trae ninguno: su única prueba,
tests/references, verifica que existan las rutas que nombra. Nada rechaza un skill sin ejemplos. - Estado
- convención
- Fuente
- platform-skills
README.md,skills/airframe-platform/
Cada producto publica su propia parte del mapa, y solo la suya.
- Mecanismo
- El trabajo
validate:fragmentdel componente catalog-publish construye el fragmento en el merge request sin ninguna credencial; en la rama main protegida,release:cataloglo publica con la identidad que el repositorio ya tiene. La identidad de apply de producción de un producto puede escribir solo bajo el prefijo de su producto. Los cuatro repositorios de la plataforma comparten una identidad,platform-docs@, cuyo permiso cubre todo el prefijo de la plataforma, así que nada impide que uno escriba la parte de otro. - Estado
- aplicado
- Fuente
- control-plane
templates/catalog-publish/template.yml,roots/executor/variables.tf
El mapa se reconstruye solo a partir de los últimos fragmentos.
- Mecanismo
- El agregador, un trabajo de Cloud Run, se ejecuta cuando una identidad que publica lo pide después de una publicación, y cada hora según una programación. Lee la lista de productos del catálogo, omite un fragmento roto dejando sus motivos en el registro de la ejecución y guarda las tres últimas versiones.
- Estado
- aplicado
- Fuente
- operations
eventcatalog/,roots/eventcatalog/
Un agente de código puede consultar el mapa con el servidor MCP del catálogo.
- Mecanismo
- El servidor está diseñado; el índice legible por máquina que leería se publica hoy junto a cada compilación.
- Estado
- diseñado
- Fuente
- landing-zone
docs/guides/architecture-catalog.md
Los documentos de la plataforma coinciden con su código.
- Mecanismo
- Un cambio lleva sus documentos en el mismo merge request y la revisión lo sostiene; ningún trabajo compara los dos. Diferencias conocidas hoy: la guía de seguridad pone Binary Authorization en cada proyecto; la guía de observabilidad le da a cada equipo una programación de guardias; el ADR-0016 dice que la destrucción de una vista previa quita su estado, que el ejecutor conserva; y los contratos cuentan el tiempo de vida de una vista previa desde su último push, el ejecutor desde su último apply.
- Estado
- convención
- Fuente
- landing-zone
docs/guides/security.md,docs/guides/identity.md,docs/guides/observability.md,docs/contracts.md8; control-planedocs/adr/0016-the-preview-lifecycle-through-the-executor.md,executor/scripts/preview.sh
Dónde está
En el repositorio landing-zone:
- docs/reviews/: las revisiones de la implementación y lo que las responde
- docs/adaptations.md: dónde la construcción se aparta del diseño
- docs/guides/security.md: la guía de seguridad de la plataforma
En el repositorio control-plane:
