specleap-framework 2.1.14 → 2.2.1

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.
@@ -22,6 +22,30 @@ Esto incluye:
22
22
 
23
23
  ## Flujo
24
24
 
25
+ ### 0. Cargar credenciales desde .env
26
+
27
+ **ANTES de cualquier comando que necesite Asana**, cargar las variables de entorno desde el `.env` del proyecto SpecLeap. `setup.sh` guarda allí `ASANA_ACCESS_TOKEN` y `ASANA_WORKSPACE_GID`, pero la shell de Claude Code no las carga automáticamente.
28
+
29
+ ```bash
30
+ # Cargar .env si existe (no fallar si no existe)
31
+ if [ -f .env ]; then
32
+ set -a
33
+ source .env
34
+ set +a
35
+ fi
36
+
37
+ # Verificar que el token quedó cargado
38
+ if [ -z "${ASANA_ACCESS_TOKEN:-}" ]; then
39
+ echo "❌ ASANA_ACCESS_TOKEN no está configurado en .env ni en la shell"
40
+ echo " Re-ejecuta bash setup.sh para configurar Asana, o exporta manualmente."
41
+ exit 1
42
+ fi
43
+ ```
44
+
45
+ **Importante:** los scripts `scripts/generate-asana-structure.sh` y `scripts/create-asana-tasks.sh` también cargan `.env` por su cuenta como red de seguridad. Pero comprobar aquí permite dar un mensaje claro al usuario antes de invocar el script.
46
+
47
+ ---
48
+
25
49
  ### 1. Identificar Proyecto
26
50
 
27
51
  Si no se especifica ruta:
@@ -29,9 +53,9 @@ Si no se especifica ruta:
29
53
  ¿Para qué proyecto quieres crear el backlog?
30
54
 
31
55
  **Proyectos disponibles:**
32
- 1. app-tienda
33
- 2. api-backend
34
- 3. dashboard-analytics
56
+ 1. task-manager
57
+ 2. inventory-app
58
+ 3. crm-suite
35
59
 
36
60
  Responde con el número o nombre:
37
61
  ```
@@ -208,8 +232,14 @@ Edita `scripts/generate-asana-structure.sh`:
208
232
  ## Requisitos
209
233
 
210
234
  1. **CONTRATO.md** existente
211
- 2. **ASANA_ACCESS_TOKEN** configurado en ~/.zshrc
212
- 3. **ASANA_WORKSPACE_GID** configurado (o se detecta automáticamente)
235
+ 2. **ASANA_ACCESS_TOKEN** y **ASANA_WORKSPACE_GID** en `.env` del proyecto SpecLeap (`setup.sh` lo crea al instalar)
236
+
237
+ Los scripts cargan `.env` automáticamente. Si necesitas verificar manualmente:
238
+
239
+ ```bash
240
+ cd <ruta-proyecto-specleap>
241
+ cat .env | grep ASANA
242
+ ```
213
243
 
214
244
  ---
215
245
 
@@ -218,20 +248,27 @@ Edita `scripts/generate-asana-structure.sh`:
218
248
  ### "Script no encontrado"
219
249
 
220
250
  ```bash
221
- cd ~/specleap-framework
222
251
  ls scripts/generate-asana-structure.sh
223
- # Si no existe, verifica instalación
252
+ # Si no existe, verifica instalación o re-ejecuta setup.sh
224
253
  ```
225
254
 
226
255
  ### "ASANA_ACCESS_TOKEN no configurado"
227
256
 
257
+ El `.env` del proyecto SpecLeap no existe o no contiene el token. Soluciones:
258
+
228
259
  ```bash
229
- # Verifica que está en tu ~/.zshrc
230
- grep ASANA_ACCESS_TOKEN ~/.zshrc
260
+ # Verificar que existe el .env y tiene el token
261
+ ls -la .env && grep ASANA .env
231
262
 
232
- # Si no está, agrégalo:
233
- echo 'export ASANA_ACCESS_TOKEN="tu-token-aqui"' >> ~/.zshrc
234
- source ~/.zshrc
263
+ # Si falta o está vacío, re-ejecutar el paso de configuración Asana del setup
264
+ bash setup.sh
265
+ ```
266
+
267
+ Si por alguna razón prefieres exportar manualmente (sin pasar por `.env`):
268
+
269
+ ```bash
270
+ export ASANA_ACCESS_TOKEN="tu-token-aqui"
271
+ export ASANA_WORKSPACE_GID="tu-workspace-gid"
235
272
  ```
236
273
 
237
274
  ### "Error: Not Authorized"
package/CHANGELOG.md CHANGED
@@ -7,6 +7,62 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.2.1] - 2026-05-22
11
+
12
+ ### Fixed
13
+
14
+ - **Bug crítico: los Agent Skills no se cargaban en Claude Code.** `scripts/install-skills.sh` instalaba en `$HOME/.skills/`, que es un path obsoleto que Claude Code dejó de monitorizar. El path canónico que auto-descubre Claude Code es `$HOME/.claude/skills/`. Resultado del bug: todos los usuarios de SpecLeap (incluido Styng) tenían los 34 Agent Skills instalados pero **invisibles** para el runtime — ninguno se activaba por contexto. Detectado tras consultar la doc oficial de Claude Code: solo lee skills de `~/.claude/skills/` (user-level) y `.claude/skills/` (project-level).
15
+ - **Fix**: `scripts/install-skills.sh` ahora instala en `$HOME/.claude/skills/`. Si detecta una instalación legacy en `$HOME/.skills/` (de versiones ≤ 2.2.0), crea un symlink desde el path canónico apuntando al legacy. Así los usuarios existentes no tienen que mover archivos ni reinstalar — solo ejecutar `bash scripts/install-skills.sh` una vez para que el symlink se cree.
16
+ - **Migración manual** (alternativa al symlink automático): `ln -s ~/.skills ~/.claude/skills`.
17
+ - **Verificación**: tras el fix, decirle "Hola" a Claude Code dentro del proyecto y pedir algo que dispare un skill conocido (ej: "qué debo verificar antes de cerrar un ticket") debe activar `verification-before-completion`.
18
+
19
+ ### Changed
20
+
21
+ - **`CLAUDE.md`, `README.md`, `SETUP.md`, `scripts/README.md`, `.commands/compliance.md`** actualizados para reflejar el path canónico `~/.claude/skills/` y documentar la compatibilidad con instalaciones legacy.
22
+
23
+ ## [2.2.0] - 2026-05-02
24
+
25
+ ### Changed
26
+
27
+ - **`setup.sh` — el prompt del nombre de carpeta se movió a DESPUÉS del Paso 1 (idioma)**, antes del Paso 2 (GitHub). Ahora sale en el idioma elegido (sólo ES o sólo EN, no bilingüe a la vez como en v2.1.14). El comportamiento funcional es idéntico (Enter para mantener nombre actual con default `specleap-framework`, valida caracteres, renombra in-place si se cambia, salta si `SPECLEAP_INSTALL_PATH` ya está set por `bin/specleap`). Reportado por Styng tras testear v2.1.14: el bloque salía con texto bilingüe simultáneo porque se ejecutaba antes de saber qué idioma había elegido el usuario.
28
+
29
+ - **`.commands/inicio.md` — nuevo Paso 0 (antes de listar proyectos) que ofrece instalar `markitdown`** (Microsoft, MIT, Python 3.10+) como herramienta opcional. Convierte PDF/Word/Excel/PowerPoint/HTML/CSV/JSON/XML/EPUB a Markdown. Cuando SpecLeap procesa documentos no-markdown durante el flujo conversacional, esta conversión previa baja el consumo de tokens entre 20% y 50%. El prompt se ejecuta UNA SOLA VEZ por sesión "Hola", es bilingüe (ES default, EN si el usuario habla en inglés), y nunca bloquea el flujo principal: si el usuario dice "No" o "Más tarde" se sigue normalmente con el listado de proyectos. Si dice "Sí", se verifica con `command -v markitdown` y se muestran instrucciones de instalación (`pip install 'markitdown[all]'` o `pipx install`) si no está. Pedido por Styng tras validar v2.1.14: quería que tras "Hola" se ofreciera la herramienta antes de empezar el primer proyecto.
30
+
31
+ ### Fixed
32
+
33
+ - **Bug Asana: `.env` no se cargaba en sesiones nuevas de Claude Code.** `setup.sh` guarda `ASANA_ACCESS_TOKEN` y `ASANA_WORKSPACE_GID` en `.env` del proyecto SpecLeap, pero la shell que arranca Claude Code no lo carga automáticamente. Resultado: `crear-tickets` y `planificar` reportaban "ASANA_ACCESS_TOKEN no configurado" aunque el token sí existía en el `.env`.
34
+ - **Fix**: `scripts/generate-asana-structure.sh` y `scripts/create-asana-tasks.sh` cargan `.env` con `set -a && source .env && set +a` al inicio (red de seguridad).
35
+ - **Fix**: `.commands/planificar.md` instruye a la AI a hacer la misma carga ANTES de comprobar el token, dando un mensaje claro al usuario si falta.
36
+ - **Fix**: `setup.sh` exporta tanto `ASANA_WORKSPACE_ID` como `ASANA_WORKSPACE_GID` (mismo valor) en `.env`, porque distintos scripts usan distintos nombres y antes había que hacer un roundtrip a la API para resolverlo.
37
+ - **Reportado por Styng** durante test 2026-05-01 de v2.1.14.
38
+
39
+ ### Changed
40
+
41
+ - **Ejemplos sesgados en cuestionario y comandos sustituidos por nombres genéricos neutros.** Antes los ejemplos eran `casa-de-peli`, `app-tienda`, `Mi Proyecto Awesome`, `Casa de Películas`, `Tienda Online de Café`, `Juan Pérez`, etc. Cambiados a `task-manager`, `inventory-app`, `crm-suite`, `Task Manager Pro`, `María García`, etc. Afecta: `scripts/lib/questions.es.json`, `scripts/lib/questions.en.json`, `.commands/inicio.md`, `.commands/explicar.md`, `.commands/implementar.md`, `.commands/planificar.md`, `.commands/nuevo/README.md`, `.commands/nuevo/responses-example.yaml`. Reportado por Styng: los ejemplos eran reconocibles como proyectos suyos y eso confunde a usuarios nuevos.
42
+ - **Pregunta 9 (competidores) ahora explica el "para qué".** Antes el `help` decía solo "Productos similares que te sirven de inspiración" — el usuario no entendía por qué se preguntaba. Ahora dice "Si conoces apps similares, las usaré como referencia para sugerir features y patrones de UX. Si no, escribe `ninguno` o déjalo vacío".
43
+
44
+ ### Added
45
+
46
+ - **Tres modos de cuestionario al inicio del Flujo A (proyecto nuevo): MVP, Proyecto serio, Modo creativo.** Después de pedir el nombre del proyecto, `.commands/inicio.md` lanza un `AskUserQuestion` (Paso A0) preguntando qué tipo de proyecto se va a montar:
47
+ - **MVP** (58 preguntas, 15-20 min) — proyecto pequeño / prototipo / 1 persona o equipo pequeño. Es el comportamiento histórico.
48
+ - **Proyecto serio** (93 preguntas, 25-35 min) — equipo + departamentos + compliance + SLAs. Las 58 base + 35 nuevas: governance (5), departamentos involucrados (3), integraciones empresariales (5: SSO, ERP, CRM, BI, payroll), SLAs y resiliencia (5: uptime/RTO/RPO/DR/on-call), compliance (4: frameworks, DPO, audit log retention, data residency), roadmap por fases (3), procesos de release (3: feature flags, deploy strategy, rollback), observabilidad (3: APM/alerting/dashboards), multi-X (4: idiomas, tenant, regiones, i18n strategy).
49
+ - **Modo creativo** (5-10 min) — el usuario describe el proyecto en un párrafo libre; la AI extrae lo dicho con razonamiento estructurado, muestra un resumen para validar, y solo pregunta los **campos críticos** que no fueron mencionados (`scripts/lib/critical_fields.json` define 18 críticos para MVP y 11 extra para Serio).
50
+
51
+ - **Transiciones bidireccionales entre modos (Paso A9).** Tras generar el CONTRATO en cualquier modo, ofrecer al usuario:
52
+ - Mantener como está → seguir a `crear-tickets`.
53
+ - Pasar a Serio → contestar las 35 preguntas extra de governance/compliance/SLAs (manteniendo las respuestas existentes).
54
+ - Pasar a Creativo → describir matices en un párrafo libre que se añade como sección "Contexto Adicional" del CONTRATO.
55
+ El paso es iterativo: se puede repetir para ir construyendo el CONTRATO incrementalmente.
56
+
57
+ - **`scripts/lib/questions.es.json` y `scripts/lib/questions.en.json` ahora marcan cada pregunta con un campo `modes`.** Las 58 base llevan `["mvp", "serio"]` (aparecen en ambos modos); las 35 nuevas llevan `["serio"]` (solo en modo serio). El cuestionario filtra por modo elegido antes de renderizar.
58
+
59
+ - **Nuevo archivo `scripts/lib/critical_fields.json`** que define los campos mínimos que el modo creativo verifica tras la extracción del párrafo del usuario. Si falta alguno, la AI hace una pregunta dirigida con contexto explicando POR QUÉ se necesita.
60
+
61
+ ### Removed
62
+
63
+ - **`composer.json`** — residual de un proyecto Laravel previo (`barryvdh/laravel-dompdf`). SpecLeap no usa Composer ni PHP en sus dependencias; el archivo nunca debió formar parte del paquete npm.
64
+ - **`package-lock.json`** — sin sentido en un paquete que no declara `dependencies` ni `devDependencies` en `package.json`. Solo añadía ruido al diff.
65
+
10
66
  ## [2.1.14] - 2026-05-01
11
67
 
12
68
  ### Changed
package/CLAUDE.md CHANGED
@@ -172,7 +172,7 @@ Read and follow these standards for ALL code:
172
172
 
173
173
  ## Agent Skills (Progressive Disclosure)
174
174
 
175
- If **20 Agent Skills TIER 1** are installed (`~/.skills/`), they activate automatically:
175
+ If **Agent Skills TIER 1 + TIER 2 (34 total)** are installed (`~/.claude/skills/`, path that Claude Code auto-discovers), they activate automatically:
176
176
 
177
177
  ### Activation Triggers
178
178
 
package/README.md CHANGED
@@ -96,7 +96,7 @@ bash setup.sh
96
96
  | **Trae los archivos** | npm los descarga | git los clona del repo |
97
97
  | **Ideal para** | Empezar rápido, no recordar el flujo de git | Devs que ya manejan git fluidamente |
98
98
 
99
- A partir de aquí ambos flows son idénticos: el `setup.sh` solicita los tokens de GitHub y Asana, instala los 34 Agent Skills en `~/.skills/` y genera la estructura base. Tiempo total: 10 a 15 minutos.
99
+ A partir de aquí ambos flows son idénticos: el `setup.sh` solicita los tokens de GitHub y Asana, instala los 34 Agent Skills en `~/.claude/skills/` y genera la estructura base. Tiempo total: 10 a 15 minutos.
100
100
 
101
101
  **Requisitos previos:**
102
102
 
@@ -139,7 +139,7 @@ El prefijo `/` está reservado por Claude Code para sus propios slash commands (
139
139
 
140
140
  ## Agent Skills
141
141
 
142
- SpecLeap instala **34 Agent Skills profesionales** en `~/.skills/` durante el setup. Se activan automáticamente cuando el contexto lo requiere.
142
+ SpecLeap instala **34 Agent Skills profesionales** en `~/.claude/skills/` (path canónico que Claude Code auto-descubre) durante el setup. Se activan automáticamente cuando el contexto lo requiere.
143
143
 
144
144
  ### TIER 1 — 20 skills base
145
145
 
package/SETUP.md CHANGED
@@ -69,7 +69,7 @@ bash setup.sh
69
69
  **Qué hace `setup.sh`:**
70
70
  - Selecciona idioma (Español/English)
71
71
  - Pide tokens GitHub y Asana
72
- - Instala los 34 Agent Skills en `~/.skills/`
72
+ - Instala los 34 Agent Skills en `~/.claude/skills/` (path canónico que Claude Code auto-descubre)
73
73
  - Configura CodeRabbit
74
74
  - Crea estructura base + archivos de configuración
75
75
 
@@ -233,7 +233,7 @@ Instalación:
233
233
  bash scripts/install-skills.sh
234
234
  ```
235
235
 
236
- Se descargan e instalan 34 skills en `~/.skills/` (20 TIER 1 más 14 TIER 2):
236
+ Se descargan e instalan 34 skills en `~/.claude/skills/` (path canónico que Claude Code auto-descubre — desde v2.2.1; instalaciones legacy en `~/.skills/` siguen funcionando vía symlink automático). 20 TIER 1 más 14 TIER 2:
237
237
 
238
238
  - **Consistencia (6):** `verification-before-completion`, `systematic-debugging`, `requesting-code-review`, `receiving-code-review`, `code-reviewer`, `debugging-wizard`
239
239
  - **Backend (6):** `laravel-specialist`, `api-designer`, `database-optimizer`, `python-pro`, `react-expert`, `typescript-pro`
@@ -247,7 +247,7 @@ Se descargan e instalan 34 skills en `~/.skills/` (20 TIER 1 más 14 TIER 2):
247
247
  Verificar lo instalado:
248
248
 
249
249
  ```bash
250
- ls ~/.skills/
250
+ ls ~/.claude/skills/
251
251
  ```
252
252
 
253
253
  ---
@@ -393,7 +393,7 @@ export PATH="$PATH:$(pwd)/openspec/cli"
393
393
 
394
394
  1. Verifica instalación:
395
395
  ```bash
396
- ls -la ~/.skills/
396
+ ls -la ~/.claude/skills/
397
397
  ```
398
398
 
399
399
  2. Reinicia tu IDE (VSCode/Cursor/JetBrains)
@@ -439,7 +439,7 @@ chmod +x .git/hooks/pre-commit
439
439
  - [ ] IDE abierto (VSCode/Cursor) y chat con Claude funcional
440
440
  - [ ] Comando `ayuda` ejecutado exitosamente
441
441
  - [ ] **Asana configurado en `.env`** (OBLIGATORIO)
442
- - [ ] **20 Agent Skills instaladas en ~/.skills/** (OBLIGATORIO)
442
+ - [ ] **34 Agent Skills instaladas en ~/.claude/skills/** (OBLIGATORIO)
443
443
  - [ ] **Git hooks instalados** (OBLIGATORIO)
444
444
  - [ ] **CodeRabbit configurado en GitHub** (OBLIGATORIO)
445
445
  - [ ] **Repositorio pusheado a GitHub** (OBLIGATORIO)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specleap-framework",
3
- "version": "2.1.14",
3
+ "version": "2.2.1",
4
4
  "description": "Spec-Driven Development Framework — Transform VSCode, Cursor, JetBrains into spec-first development machines",
5
5
  "keywords": [
6
6
  "spec-driven-development",
package/scripts/README.md CHANGED
@@ -43,7 +43,7 @@ git commit --no-verify -m "mensaje"
43
43
 
44
44
  ### `install-skills.sh`
45
45
 
46
- **Propósito:** Instalar los 34 Agent Skills del framework en `~/.skills/`.
46
+ **Propósito:** Instalar los 34 Agent Skills del framework en `~/.claude/skills/` (path canónico que Claude Code auto-descubre). Si existe `~/.skills/` de instalaciones previas (versiones ≤ 2.2.0), se crea un symlink desde el path canónico para mantener compatibilidad.
47
47
 
48
48
  **Uso:**
49
49
  ```bash
@@ -8,6 +8,15 @@ set -euo pipefail
8
8
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
9
  ASANA_UTILS="$SCRIPT_DIR/lib/asana-utils.sh"
10
10
 
11
+ # Auto-cargar .env desde el root del proyecto SpecLeap.
12
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
13
+ if [[ -f "$PROJECT_ROOT/.env" ]]; then
14
+ set -a
15
+ # shellcheck disable=SC1090
16
+ source "$PROJECT_ROOT/.env"
17
+ set +a
18
+ fi
19
+
11
20
  source "$ASANA_UTILS"
12
21
 
13
22
  # Colores
@@ -4,6 +4,17 @@
4
4
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
5
  source "$SCRIPT_DIR/../.specleap/i18n.sh"
6
6
 
7
+ # Auto-cargar .env desde el root del proyecto SpecLeap.
8
+ # setup.sh guarda ASANA_ACCESS_TOKEN/ASANA_WORKSPACE_GID en .env, pero las
9
+ # shells nuevas (ej: las que arranca Claude Code) no lo cargan automáticamente.
10
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
11
+ if [[ -f "$PROJECT_ROOT/.env" ]]; then
12
+ set -a
13
+ # shellcheck disable=SC1090
14
+ source "$PROJECT_ROOT/.env"
15
+ set +a
16
+ fi
17
+
7
18
  # SpecLeap — Generador de estructura Asana
8
19
  # Convierte CONTRATO.md → proyecto Asana con secciones y tareas
9
20
 
@@ -1,6 +1,10 @@
1
1
  #!/bin/bash
2
- # SpecLeap — Instalador de Agent Skills TIER 1 + TIER 2
3
- # Versión 2.1.1 — 34 skills profesionales
2
+ # SpecLeap — Instalador de Agent Skills TIER 1 + TIER 2 (34 skills profesionales)
3
+ #
4
+ # Path: instala en $HOME/.claude/skills/ (path canónico que Claude Code
5
+ # auto-descubre). Si existe $HOME/.skills/ (path legacy de versiones previas
6
+ # de SpecLeap), se crea un symlink desde el path canónico para mantener
7
+ # compatibilidad sin mover archivos.
4
8
 
5
9
  set -e
6
10
 
@@ -85,9 +89,22 @@ INSTALLED=0
85
89
  FAILED=0
86
90
  SKIPPED=0
87
91
 
88
- SKILLS_DIR="$HOME/.skills"
92
+ SKILLS_DIR="$HOME/.claude/skills"
93
+ LEGACY_SKILLS_DIR="$HOME/.skills"
89
94
  TMP_DIR="/tmp/specleap-skills-$$"
90
95
 
96
+ # Compatibilidad con instalaciones legacy:
97
+ # Si el path antiguo ($HOME/.skills/) tiene skills y el path canónico
98
+ # no existe todavía, crear symlink. Así Claude Code los ve sin tener
99
+ # que mover archivos ni reinstalar nada.
100
+ if [ -d "$LEGACY_SKILLS_DIR" ] && [ ! -e "$SKILLS_DIR" ]; then
101
+ mkdir -p "$HOME/.claude"
102
+ ln -s "$LEGACY_SKILLS_DIR" "$SKILLS_DIR"
103
+ echo -e "${YELLOW}⚠️ Detected legacy skills path $LEGACY_SKILLS_DIR${NC}"
104
+ echo -e "${YELLOW} Created symlink at $SKILLS_DIR for Claude Code auto-discovery.${NC}"
105
+ echo ""
106
+ fi
107
+
91
108
  mkdir -p "$SKILLS_DIR"
92
109
  mkdir -p "$TMP_DIR"
93
110
 
@@ -0,0 +1,39 @@
1
+ {
2
+ "metadata": {
3
+ "version": "1.0",
4
+ "description": "Campos mínimos que el modo 'creativo' verifica tras extraer información del párrafo del usuario. Si falta alguno, la AI pregunta sólo ese (no las 58/93 completas). Las claves apuntan a IDs de questions.{es,en}.json."
5
+ },
6
+ "mvp_critical": [
7
+ "project.name",
8
+ "project.display_name",
9
+ "project.responsible",
10
+ "identity.objective",
11
+ "identity.target_audience",
12
+ "stack.backend.framework",
13
+ "stack.frontend.framework",
14
+ "stack.database.engine",
15
+ "features.core",
16
+ "features.auth.enabled",
17
+ "design.responsive",
18
+ "design.primary_color",
19
+ "deployment.hosting",
20
+ "deployment.ssl",
21
+ "security.level",
22
+ "security.gdpr_compliant",
23
+ "testing.coverage_target",
24
+ "constraints.time_limit"
25
+ ],
26
+ "serio_critical_extra": [
27
+ "governance.product_owner",
28
+ "governance.release_approver",
29
+ "departments.list",
30
+ "compliance.frameworks",
31
+ "sla.uptime_target",
32
+ "sla.rto",
33
+ "roadmap.phases",
34
+ "release.deploy_strategy",
35
+ "observability.apm_logs_metrics",
36
+ "multi.tenant",
37
+ "multi.regions"
38
+ ]
39
+ }