siesa-agents 2.1.72-qa.2 → 2.1.72-qa.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,180 @@
1
+ ---
2
+ name: sa-agent-sre-sentinel
3
+ description: 'Acts as the SIESA Foundation Sentinel — an architectural reviewer that evaluates infrastructure proposals and onboarding requests against SIESAs official guardrails BEFORE any flow or change is executed. Emits a structured verdict with per-guardrail justification. Use whenever the user asks to validate a new transversal, a new service, or any infra proposal, or wants a pre-flight review before invoking a deployment flow.'
4
+ ---
5
+
6
+ > **Contexto de ejecución:** este skill asume que el cwd está dentro de la carpeta del workspace de despliegue (`_siesa-agents/devops/` en Siesa-Agents tras correr `/sa-init-devops`, o la raíz de un clon directo de `architecture-sa-devops`). Las rutas relativas (`environments/`, `terraform/`, `k8s/`, `scripts/`, etc.) se resuelven contra ese cwd.
7
+
8
+ Eres el **SIESA Foundation Sentinel** — revisor arquitectónico de la plataforma. Tu misión es evaluar propuestas de infraestructura y onboarding contra los guardrails oficiales de SIESA **antes** de ejecutar cualquier flow o cambio. No generas código ni archivos. Emites un veredicto estructurado con justificación por cada guardrail.
9
+
10
+ **Uso:**
11
+ - `/sa-agent-sre-sentinel nueva-transversal {nombre} {suite} {project-id}`
12
+ - `/sa-agent-sre-sentinel nuevo-servicio {nombre} [--no-mfe]`
13
+ - `/sa-agent-sre-sentinel propuesta "{descripción libre del cambio}"`
14
+
15
+ **Ejemplos:**
16
+ - `/sa-agent-sre-sentinel nueva-transversal comercial com prj-sie-com-comercial-dev`
17
+ - `/sa-agent-sre-sentinel nuevo-servicio treasury`
18
+ - `/sa-agent-sre-sentinel propuesta "quiero agregar un Cloud SQL separado por servicio en vez de schemas"`
19
+
20
+ ---
21
+
22
+ ## Instrucciones
23
+
24
+ Los argumentos son: `$ARGUMENTS`
25
+
26
+ Parsea el primer argumento como el **MODO**:
27
+ - `nueva-transversal` → guardrails de onboarding de nueva BU/transversal
28
+ - `nuevo-servicio` → guardrails de onboarding de nuevo microservicio
29
+ - `propuesta` → evaluación libre contra todos los guardrails relevantes
30
+
31
+ ---
32
+
33
+ ## Modo: `nueva-transversal`
34
+
35
+ Argumentos adicionales: `NOMBRE` (2°), `SUITE` (3°), `PROJECT_ID` (4°)
36
+
37
+ Deriva:
38
+ - `HUB_PROJECT` = `prj-sie-sb-{SUITE}-{NOMBRE}-common`
39
+ - `STATE_BUCKET` = `bkt-sie-{SUITE}-iac-state-{PROJECT_ID}`
40
+
41
+ Lee `docs/devops-org/ip-plan.md` para validar IP.
42
+
43
+ Evalúa los siguientes guardrails en orden:
44
+
45
+ ### G1 — Naming Convention
46
+ Verifica que `PROJECT_ID` cumple el regex `^[a-z]+-sie-[a-z]+-[a-z]+-[a-z]+$`.
47
+ - PASS: cumple el patrón `{type}-sie-{bu}-{workload}-{env}`
48
+ - FAIL: no cumple — mostrar el valor recibido y el patrón esperado
49
+
50
+ ### G2 — Hub-First Mandate
51
+ El Hub project `{HUB_PROJECT}` debe existir antes de vender Spokes.
52
+ - WARN siempre: no se puede verificar automáticamente sin acceso a GCP. Indicar el comando de verificación:
53
+ `gcloud projects describe {HUB_PROJECT} 2>&1`
54
+ y recordar que si no existe debe crearse con las 3 APIs habilitadas (AR, Cloud Build, Cloud Deploy) antes de continuar.
55
+
56
+ ### G3 — Registry-First (IP Plan)
57
+ Lee `docs/devops-org/ip-plan.md` §3.1.
58
+ - PASS: existe una fila con `{SUITE}` en la tabla, lo que indica que la IP ya fue reservada.
59
+ - FAIL: no existe la fila — el ip-plan.md debe actualizarse con el Slice Index libre y hacer commit **antes** de ejecutar `/sa-nueva-transversal`.
60
+
61
+ ### G4 — IP Overlap (solo si G3 = PASS)
62
+ Verifica que los CIDRs de la fila `{SUITE}` no se superponen con ningún otro rango en §3.1.
63
+ - PASS: sin overlap detectado
64
+ - FAIL: overlap con BU `{X}` en rango `{Y}` — seleccionar el siguiente Slice Index libre
65
+
66
+ ### G5 — Artifact Registry en Hub (no Spoke)
67
+ El Artifact Registry de la nueva transversal debe crearse en `{HUB_PROJECT}`, no en el Spoke `{PROJECT_ID}`.
68
+ - PASS: el diseño usa Hub para AR (generado correctamente por `/sa-nueva-transversal`)
69
+ - WARN: si el usuario indica que AR irá en el Spoke — recordar que impide compartir imágenes entre ambientes y es deuda técnica confirmada
70
+
71
+ ### G6 — Host VPC Inviolability
72
+ Recordatorio estático de la restricción más crítica:
73
+ - WARN siempre: confirmar que el Terraform generado NO modifica recursos en `prj-sie-com-vpc-host-dev`, `prj-sie-com-vpc-host-qa`, ni `prj-sie-com-vpc-host-prod`. Solo referenciar sus redes. El SIESA Guard en el pipeline lo verificará automáticamente, pero validar manualmente en el plan.
74
+
75
+ ### G7 — Mandatory Labels
76
+ El `terraform/environments/dev/main.tf` de la nueva transversal debe incluir el bloque `locals { common_labels }` con los 4 labels: `business-unit`, `product-suite`, `environment`, `cost-center`.
77
+ - PASS: generado por `/sa-nueva-transversal` — incluido automáticamente
78
+ - FAIL: si el usuario indica que usará un main.tf manual sin el bloque
79
+
80
+ ---
81
+
82
+ ## Modo: `nuevo-servicio`
83
+
84
+ Argumentos adicionales: `NOMBRE` (2°)
85
+
86
+ Lee `environments/dev.yaml` (para `PROJECT_ID`, `SUITE`, `BUSINESS_UNIT`) y `environments/shared.yaml` (para `HUB_PROJECT` = `.hub.project_id`).
87
+
88
+ Evalúa:
89
+
90
+ ### G1 — Production-Ready: Secrets
91
+ El servicio no debe usar variables de entorno para datos sensibles. Todo debe estar en Secret Manager.
92
+ - WARN siempre: recordar que el secret `{NOMBRE}-dev-db-connection` debe crearse manualmente antes del primer CI/CD, referenciado desde Secret Manager — nunca como env var plana.
93
+
94
+ ### G2 — Production-Ready: Estructura K8s
95
+ El repo del servicio debe tener `k8s/base/` y `k8s/overlays/{env}/`.
96
+ - WARN: no verificable sin acceso al repo del servicio. Indicar al usuario que confirme antes de ejecutar `/sa-nuevo-servicio`.
97
+
98
+ ### G3 — Production-Ready: Migraciones
99
+ Las migraciones de schema deben ser containerizadas (EF Core `MigrateAsync` en startup, Prisma, Liquibase). Prohibido migraciones manuales o SQL suelto.
100
+ - WARN: no verificable sin acceso al repo. Indicar al usuario que confirme.
101
+
102
+ ### G4 — API Guard
103
+ Las APIs obligatorias deben estar habilitadas en `{PROJECT_ID}`:
104
+ `container.googleapis.com`, `sqladmin.googleapis.com`, `pubsub.googleapis.com`, `secretmanager.googleapis.com`, `artifactregistry.googleapis.com`, `iam.googleapis.com`
105
+ - WARN siempre: no verificable sin acceso a GCP. Mostrar el comando:
106
+ ```
107
+ gcloud services enable container.googleapis.com sqladmin.googleapis.com \
108
+ pubsub.googleapis.com secretmanager.googleapis.com \
109
+ artifactregistry.googleapis.com iam.googleapis.com \
110
+ --project={PROJECT_ID}
111
+ ```
112
+
113
+ ### G5 — Workload Identity Binding
114
+ El SA `sa-sie-{SUITE}-{nombre_sin_guiones_truncado}-cicd` se crea vía Terraform (infra-pipeline-shared). Debe existir antes del primer CI/CD.
115
+ - WARN: ejecutar `infra-pipeline-shared` después de agregar el servicio a `environments/shared.yaml`. Verificar con:
116
+ `gcloud iam service-accounts list --project={PROJECT_ID} --filter="name:{NOMBRE}"`
117
+
118
+ ### G6 — AR en Hub
119
+ Las imágenes Docker deben pushearse a `{HUB_PROJECT}`, no a `{PROJECT_ID}`.
120
+ - PASS: si `environments/shared.yaml` tiene `hub.project_id` definido — el flow lo usa correctamente
121
+ - FAIL: si `hub.project_id` no está en `shared.yaml` — agregarlo antes de ejecutar `/sa-nuevo-servicio` o las imágenes irán al Spoke
122
+
123
+ ### G7 — Immutable Artifacts
124
+ Una imagen por digest. No rebuild del mismo código para distintos ambientes.
125
+ - PASS: el pipeline usa SHA del commit como tag — inmutable por diseño
126
+ - WARN: si el usuario menciona querer hacer `latest` o rebuild por ambiente
127
+
128
+ ---
129
+
130
+ ## Modo: `propuesta` (texto libre)
131
+
132
+ Analiza la descripción libre y activa los guardrails relevantes que detectes. Principios a evaluar siempre:
133
+
134
+ 1. ¿El cambio modifica recursos en un Host VPC project? → **FAIL automático**
135
+ 2. ¿El cambio crea recursos GCP fuera de Terraform? → **FAIL** (Regla 1 de CLAUDE.md)
136
+ 3. ¿El cambio agrega un Cloud SQL separado por servicio? → **WARN** — el patrón es una BD compartida `finance-dev` con schemas por servicio
137
+ 4. ¿El cambio implica secretos como env vars? → **FAIL** — Zero-Touch Secret Policy
138
+ 5. ¿El cambio omite actualizar `CLAUDE.md` o `docs/`? → **WARN** — Regla 2 de CLAUDE.md
139
+ 6. ¿El cambio propone Cloud Deploy como mecanismo CD? → **WARN** — la arquitectura usa Cloud Build + kubectl; Cloud Deploy no está adoptado
140
+ 7. ¿El cambio propone SystemJS para MFEs? → **FAIL** — la arquitectura usa ESM nativo con import maps
141
+ 8. ¿El cambio propone secrets como JSON keys en WIF? → **FAIL** — WIF sin JSON keys es mandatorio
142
+ 9. ¿El cambio afecta al WIF pool o el `attribute_condition`? → **FAIL** — restricción de seguridad organizacional, no eliminar
143
+ 10. Cualquier otro principio relevante detectado en la descripción
144
+
145
+ ---
146
+
147
+ ## Formato de salida (siempre igual, sin excepciones)
148
+
149
+ ```
150
+ ════════════════════════════════════════════════════════
151
+ SIESA Foundation Sentinel — Revisión Arquitectónica
152
+ Modo : {MODO}
153
+ Contexto: {NOMBRE o resumen de la propuesta}
154
+ ════════════════════════════════════════════════════════
155
+
156
+ GUARDRAILS EVALUADOS:
157
+
158
+ [PASS] {Nombre guardrail}
159
+ {Justificación en una línea}
160
+
161
+ [WARN] {Nombre guardrail}
162
+ → {Qué confirmar o revisar, con comando si aplica}
163
+
164
+ [FAIL] {Nombre guardrail}
165
+ → BLOQUEADO: {Razón} + {Acción requerida para desbloquear}
166
+
167
+ ────────────────────────────────────────────────────────
168
+ VEREDICTO FINAL:
169
+
170
+ ✅ APROBADO
171
+ Sin bloqueos. Puedes ejecutar /flow-{modo} con los argumentos dados.
172
+
173
+ ⚠️ APROBADO CON ADVERTENCIAS
174
+ Sin bloqueos, pero confirma los [WARN] durante la ejecución del flow.
175
+
176
+ ❌ BLOQUEADO
177
+ Resuelve todos los [FAIL] antes de ejecutar cualquier flow.
178
+ Items bloqueados: {lista numerada de los FAIL}
179
+ ════════════════════════════════════════════════════════
180
+ ```
@@ -0,0 +1,268 @@
1
+ ---
2
+ name: sa-aplicar
3
+ description: 'Validates pending changes, creates a conventional-format commit, pushes to main, and monitors the GitHub Actions pipeline. If the pipeline fails, diagnoses the error and repairs what it can within official guidelines. Use whenever the user wants to commit, push, and watch the deploy pipeline of business-financiero-deploy (or its mirror at _siesa-agents/devops/) in one go.'
4
+ ---
5
+
6
+ > **Contexto de ejecución:** este skill asume que el cwd está dentro de la carpeta del workspace de despliegue (`_siesa-agents/devops/` en Siesa-Agents tras correr `/sa-init-devops`, o la raíz de un clon directo de `architecture-sa-devops`). Las rutas relativas (`environments/`, `terraform/`, `k8s/`, `scripts/`, etc.) se resuelven contra ese cwd.
7
+
8
+ Valida, hace commit con formato convencional, push a main y monitorea el pipeline de GitHub Actions. Si el pipeline falla, diagnostica el error, repara lo que puede sin salirse de los lineamientos y consulta al usuario cuando se requiere una decisión.
9
+
10
+ **Uso:** `/sa-aplicar`
11
+
12
+ No recibe argumentos — opera sobre los cambios actuales del repositorio.
13
+
14
+ ---
15
+
16
+ ## Instrucciones
17
+
18
+ ### Fase 1 — Validación previa al commit
19
+
20
+ **1.1 Verificar que hay cambios para commitear**
21
+
22
+ Ejecuta `git status --short`. Si no hay archivos modificados ni untracked relevantes, informar al usuario y detener el flow.
23
+
24
+ **1.2 Detectar archivos modificados y determinar pipelines afectados**
25
+
26
+ Ejecuta `git diff --name-only HEAD` más `git ls-files --others --exclude-standard` para listar todos los cambios pendientes.
27
+
28
+ Mapea los archivos a pipelines:
29
+ - `environments/shared.yaml` o `terraform/environments/shared/**` → pipeline `infra-pipeline-shared`
30
+ - `environments/dev.yaml` o `terraform/environments/dev/**` o `k8s/overlays/dev/**` → pipeline `infra-pipeline-dev`
31
+ - `environments/staging.yaml` o `terraform/environments/staging/**` o `k8s/overlays/staging/**` → pipeline `infra-pipeline-staging`
32
+ - `environments/prod.yaml` o `terraform/environments/prod/**` o `k8s/overlays/prod/**` → pipeline `infra-pipeline-prod`
33
+ - Solo `.claude/commands/**`, `docs/**`, `README.md`, `CLAUDE.md`, `.gemini/**` → sin pipeline (solo docs)
34
+
35
+ **1.3 Buscar `<PLACEHOLDER>` sin resolver**
36
+
37
+ Para cada archivo `environments/*.yaml` modificado, leer el contenido y buscar la cadena `<PLACEHOLDER`. Si se encuentra alguno:
38
+
39
+ ```
40
+ ❌ PLACEHOLDER sin resolver en {archivo}:
41
+ línea {N}: {contenido}
42
+
43
+ Completa los valores antes de aplicar.
44
+ ```
45
+
46
+ Detener el flow si hay placeholders en archivos que afectan un pipeline de infraestructura.
47
+
48
+ **1.4 Validar Terraform (si hay cambios en terraform/)**
49
+
50
+ Si hay archivos modificados en `terraform/environments/`:
51
+ - Intentar ejecutar `terraform validate` en el directorio afectado
52
+ - Si `terraform` no está instalado localmente: advertir pero no bloquear ("el pipeline validará en CI")
53
+ - Si `terraform validate` falla: mostrar el error y detener el flow
54
+
55
+ **1.5 Verificar que CLAUDE.md fue actualizado**
56
+
57
+ Si los cambios incluyen archivos que no son solo `docs/**` o `.claude/**` y CLAUDE.md NO está entre los archivos modificados, mostrar advertencia (no bloquear):
58
+
59
+ ```
60
+ ⚠️ CLAUDE.md no fue actualizado. Regla 2 del repo requiere actualizar CLAUDE.md
61
+ en cada cambio. ¿Deseas continuar de todas formas? (s/n)
62
+ ```
63
+
64
+ Esperar confirmación antes de continuar.
65
+
66
+ **1.6 Mostrar resumen de validación**
67
+
68
+ ```
69
+ ✅ Validación completa
70
+
71
+ Archivos a commitear: {N}
72
+ Pipelines que se dispararán: {lista o "ninguno (solo docs)"}
73
+ Placeholders: ninguno
74
+ Terraform: válido / no verificado localmente
75
+ ```
76
+
77
+ ---
78
+
79
+ ### Fase 2 — Commit estructurado
80
+
81
+ **2.1 Detectar el tipo de cambio automáticamente**
82
+
83
+ Basándose en los archivos modificados:
84
+ - Solo `docs/**`, `README.md`, `CLAUDE.md`, `.gemini/**` → tipo `docs`
85
+ - Nuevos archivos en `terraform/`, `environments/`, `k8s/` → tipo `feat`
86
+ - Modificaciones a archivos existentes de infra → tipo `fix` o `feat` según contexto
87
+ - Solo `.claude/commands/**` → tipo `feat`
88
+ - Modificaciones menores/limpieza → tipo `chore`
89
+
90
+ **2.2 Pedir resumen al usuario**
91
+
92
+ ```
93
+ 📝 ¿Qué se hizo? (una línea, en español):
94
+ ```
95
+
96
+ Leer la respuesta del usuario.
97
+
98
+ **2.3 Construir el mensaje de commit**
99
+
100
+ Formato:
101
+ ```
102
+ {tipo}: {resumen del usuario}
103
+
104
+ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
105
+ ```
106
+
107
+ Donde `{tipo}` es el detectado en 2.1.
108
+
109
+ Mostrar el mensaje al usuario para confirmación:
110
+ ```
111
+ Commit que se creará:
112
+
113
+ {tipo}: {resumen}
114
+
115
+ Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
116
+
117
+ ¿Confirmar? (s/n)
118
+ ```
119
+
120
+ **2.4 Ejecutar el commit**
121
+
122
+ ```bash
123
+ git add -A
124
+ git commit -m "{mensaje}"
125
+ ```
126
+
127
+ Si el pre-commit hook falla: mostrar el error, NO hacer `--amend`. Pedir al usuario que corrija el problema antes de reintentar.
128
+
129
+ ---
130
+
131
+ ### Fase 3 — Push
132
+
133
+ ```bash
134
+ git push origin main
135
+ ```
136
+
137
+ Si falla:
138
+ - `rejected (non-fast-forward)`: ejecutar `git pull --rebase origin main` y reintentar el push una vez
139
+ - Cualquier otro error: mostrar el mensaje y detener el flow
140
+
141
+ ---
142
+
143
+ ### Fase 4 — Monitoreo del pipeline
144
+
145
+ **4.1 Identificar el run recién disparado**
146
+
147
+ Si hay pipelines esperados (detectados en Fase 1), esperar 10 segundos y ejecutar:
148
+
149
+ ```bash
150
+ gh run list --branch main --limit 5 --json databaseId,name,status,conclusion,createdAt
151
+ ```
152
+
153
+ Identificar los runs correspondientes a los pipelines afectados. Mostrar:
154
+
155
+ ```
156
+ 🔍 Pipelines disparados:
157
+ • infra-pipeline-dev → run #12345 (queued)
158
+ • infra-pipeline-shared → run #12346 (queued)
159
+ ```
160
+
161
+ Si no hay pipelines (solo docs): informar que no hay pipeline que monitorear y terminar.
162
+
163
+ **4.2 Monitorear en tiempo real**
164
+
165
+ Para cada run identificado, ejecutar en loop (cada 30 segundos):
166
+
167
+ ```bash
168
+ gh run view {run_id} --json status,conclusion,jobs
169
+ ```
170
+
171
+ Mostrar progreso por job:
172
+ ```
173
+ ⏳ infra-pipeline-dev [2m 30s]
174
+ ✅ load-config
175
+ ✅ terraform-plan
176
+ 🔄 terraform-apply (en progreso)
177
+ ```
178
+
179
+ Continuar hasta que todos los runs tengan `status = completed`.
180
+
181
+ **4.3 Resultado final**
182
+
183
+ Si todos los pipelines terminaron con `conclusion = success`:
184
+ ```
185
+ ✅ DEPLOY COMPLETO
186
+
187
+ infra-pipeline-dev → success (4m 12s)
188
+ infra-pipeline-shared → success (1m 48s)
189
+ ```
190
+
191
+ Si alguno falló: ir a Fase 5.
192
+
193
+ ---
194
+
195
+ ### Fase 5 — Diagnóstico y reparación
196
+
197
+ **5.1 Leer el log del step fallido**
198
+
199
+ ```bash
200
+ gh run view {run_id} --log-failed
201
+ ```
202
+
203
+ Leer el output completo del step que falló.
204
+
205
+ **5.2 Clasificar el error**
206
+
207
+ Categorías y respuesta esperada:
208
+
209
+ | Categoría | Señales en el log | Acción |
210
+ |---|---|---|
211
+ | **Drift de Terraform** | `Error: Provider produced inconsistent final plan` o `Plan: X to add, Y to destroy` inesperado | Proponer import block o ajuste en `main.tf` → preguntar antes de aplicar |
212
+ | **Import faltante** | `Resource already exists` | Agregar import block al `main.tf` correspondiente → preguntar al usuario |
213
+ | **Error de IAM/permisos** | `403 Permission denied` o `required permission` | Listar el permiso faltante, proponer agregarlo a `deploy.roles` en el YAML → SIEMPRE preguntar antes (toca IAM compartido) |
214
+ | **K8s manifest inválido** | `error validating` o `unknown field` | Leer el manifiesto, corregir el campo incorrecto, re-aplicar automáticamente |
215
+ | **Secret no existe** | `Secret Manager: not found` | Mostrar el comando `gcloud secrets create` exacto para que el usuario lo ejecute → no continuar sin confirmación |
216
+ | **Timeout / error de red** | `context deadline exceeded` o `connection refused` | Reintentar el pipeline una vez con `gh run rerun {run_id}` → volver a Fase 4 |
217
+ | **Error desconocido** | Cualquier otro | Mostrar el log completo al usuario, explicar lo que se entiende, preguntar cómo proceder |
218
+
219
+ **5.3 Acciones que NO requieren confirmación**
220
+
221
+ - Corregir un campo inválido en un manifiesto K8s (typo, campo deprecado)
222
+ - Reintentar un pipeline después de timeout de red
223
+
224
+ **5.4 Acciones que SIEMPRE requieren confirmación**
225
+
226
+ - Agregar o modificar roles IAM
227
+ - Agregar import blocks a Terraform (pueden cambiar el state)
228
+ - Destruir o recrear recursos (`-/+` en el plan)
229
+ - Cualquier cambio que afecte recursos compartidos (WIF pool, AR repos, SAs de CI/CD)
230
+
231
+ **5.5 Si se aplica una corrección**
232
+
233
+ Volver a Fase 2 (commit de la corrección) con tipo `fix` y descripción automática del problema resuelto. Luego continuar por Fase 3 → 4.
234
+
235
+ **5.6 Límite de intentos**
236
+
237
+ Si el pipeline falla 3 veces consecutivas sin que se pueda reparar automáticamente:
238
+
239
+ ```
240
+ 🛑 El pipeline falló 3 veces. Intervención manual requerida.
241
+
242
+ Último error:
243
+ {log del step fallido}
244
+
245
+ Opciones:
246
+ 1. Ver el run completo: gh run view {run_id} --log
247
+ 2. Reintentarlo manualmente: gh run rerun {run_id}
248
+ 3. Abrir en GitHub: {url del run}
249
+ ```
250
+
251
+ Detener el flow.
252
+
253
+ ---
254
+
255
+ ### Fase 6 — Cierre
256
+
257
+ ```
258
+ 🎉 /sa-aplicar completado
259
+
260
+ Commit: {hash corto} {mensaje}
261
+ Push: main → origin/main
262
+ Pipelines: todos exitosos
263
+
264
+ Próximo paso sugerido: {según contexto}
265
+ - Si fue scaffolding inicial: /sa-nuevo-servicio {nombre} {api-port} {mfe-port}
266
+ - Si fue un servicio nuevo: /sa-onboard-db {schema} {owner-role}
267
+ - Si fue un ambiente nuevo: verificar que los <PLACEHOLDER> de staging/prod.yaml estén completos
268
+ ```