1---2name: appinterface-check3description: Validate app-interface configuration and release readiness. Validates YAML, compares refs to live cluster, shows quotas, pending MRs. Use when user says "check app-interface", "app-interface validation".4---56# App-Interface Check78## Inputs910| Input | Type | Default | Purpose |11|-------|------|---------|---------|12| `saas_file` | string | tower-analytics | SaaS file name |13| `namespace_stage` | string | tower-analytics-stage | Stage namespace |14| `namespace_prod` | string | tower-analytics-prod | Production namespace |15| `deployment` | string | automation-analytics-api-fastapi-v2 | Deployment to check for live SHA |16| `stale_days` | int | 7 | Alert if deployed SHA older than this |17| `gitlab_project` | string | automation-analytics/automation-analytics-backend | Project for pending MRs |18| `app_name` | string | automation-analytics | Application name for search |1920## Workflow2122### 1. Bootstrap23- `persona_load("release")` — appinterface tools24- `check_known_issues("appinterface", "")`, `check_known_issues("release", "")`25- `knowledge_query(project="automation-analytics-backend", persona="release", section="gotchas")`2627### 2. Get SaaS File28- `appinterface_search(query="{app_name}")`29- `appinterface_get_saas(service_name="{saas_file}")`30- Parse refs: stage_ref, prod_ref (40-char SHAs), $ref paths3132### 3. Validation33- Validate SHA format: 40-char hex or 'main'34- Check $ref paths point to /services/ or /dependencies/35- Check required fields: name, app, resourceTemplates3637### 4. Live State (switch to devops)38- `persona_load("devops")`39- `kubectl_get_deployments(namespace="{namespace_stage}", environment="stage")` — extract deployed image SHA40- `kubectl_get_deployments(namespace="{namespace_prod}", environment="prod")` — prod SHA4142### 5. Compare State43- stage_in_sync = app-interface stage_ref matches live cluster44- prod_in_sync = app-interface prod_ref matches live cluster45- stage_ahead_of_prod = stage has newer ref46- ready_to_promote = stage_ahead and stage_in_sync4748### 6. Diff & Resources49- `appinterface_diff()` — uncommitted changes50- `appinterface_resources(namespace="{namespace_stage}")`51- `kubectl_get(resource="resourcequota", namespace="{namespace_stage}", environment="stage")`52- `kubectl_get(resource="limitrange", namespace="{namespace_stage}", environment="stage")`5354### 7. Pending MRs (switch to developer)55- `persona_load("developer")`56- `gitlab_mr_list(project="{gitlab_project}", state="opened", per_page=10)`5758### 8. Release Readiness59- ready = validation_ok and stage_ahead and no_pending_changes60- blockers: validation issues, stage not ahead, uncommitted changes61- warnings: open MRs, stage drift6263### 9. Report64- Validation status65- Live state comparison (stage vs prod)66- Pending changes67- Resource quotas/limits68- Pending MRs69- Release readiness70- Log: `memory_session_log("Checked app-interface", "Ready: {ready}")`7172### 10. Failure Learning73- Not found → `learn_tool_fix("appinterface_get_saas", "not found", "SaaS file missing", "Check saas_file input")`74- Forbidden → `learn_tool_fix("kubectl_get_deployments", "forbidden", "K8s auth expired", "Run kube_login('stage') and kube_login('prod')")`75- No route to host → `learn_tool_fix("kubectl_get_deployments", "no route to host", "VPN not connected", "Run vpn_connect()")`76- No such host → `learn_tool_fix("gitlab_mr_list", "no such host", "VPN not connected", "Run vpn_connect()")`7778## Key MCP Tools7980- `persona_load`, `appinterface_search`, `appinterface_get_saas`, `appinterface_diff`, `appinterface_resources`81- `kubectl_get_deployments`, `kubectl_get`82- `gitlab_mr_list`83- `check_known_issues`, `learn_tool_fix`, `knowledge_query`, `memory_session_log`8485## Key Namespaces8687- **tower-analytics-stage** — stage88- **tower-analytics-prod** — production8990## If Ready to Release9192```python93skill_run("release_to_prod", '{"commit_sha": "{stage_ref}"}')94```