| name | deployment-orchestrator |
| description | Pre-flight validation, post-deployment verification, and failure recovery for AWS infrastructure deployments. Use when user says "pre-flight check", "readiness audit", "deployment checklist", "validate deployment", or "recover from failed deploy". Do NOT use for writing Terraform code (use terraform-automation) or for benchmark analysis (use benchmark-analyst agent). |
Deployment Orchestrator Skill
Encodes the operational playbooks learned from GPU-serving and AgentCore Runtime deployments. This skill provides pre-flight validation checklists, post-deployment verification, and failure recovery procedures.
When to Use
- Before a capacity block session — run the pre-flight checklist
- After
terraform apply — run post-deployment verification
- When a deployment stage fails — consult failure recovery playbooks
- Before benchmarks — validate serving stack readiness
Pre-Flight Checklists
GPU Serving Pre-Flight
Run before every capacity block. Each item must be PASS before proceeding.
EKS Cluster
kubectl cluster-info
kubectl get nodes -l node-role.kubernetes.io/system
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl get pods -n kube-system -l k8s-app=kube-proxy
Storage (FSx Lustre)
aws fsx describe-file-systems --file-system-ids <id> --query 'FileSystems[0].Lifecycle'
kubectl get pv,pvc -n <namespace>
kubectl get pods -n kube-system -l app=fsx-csi-controller
kubectl exec -n <ns> <pod> -- df -h /mnt/nvme
kubectl exec -n <ns> <pod> -- ls /mnt/nvme/model/
Container Images (ECR)
for repo in $(grep -r 'FROM\|ECR_REPO' configs/ docker/ | grep -oP '\d+\.dkr\.ecr\.[^/]+/[^:]+' | sort -u); do
aws ecr describe-repositories --repository-names "$(basename $repo)" 2>/dev/null && echo "PASS: $repo" || echo "FAIL: $repo"
done
bash -n scripts/stage-images-ecr.sh
GPU / Accelerator Plugins
Items marked PENDING are expected if the GPU node hasn't joined yet — they self-heal on node join. Do not investigate PENDING items unless the node has joined and they are still not running.
kubectl get ds -n kube-system nvidia-device-plugin-daemonset
kubectl get ds -n kube-system aws-efa-k8s-device-plugin-daemonset
kubectl get ds -n kube-system dcgm-exporter
Config Scripts & Benchmark Wiring
for f in configs/*.sh; do bash -n "$f" && echo "PASS: $f" || echo "FAIL: $f"; done
python3 -c "
import ast, glob
configs = [f.split('/')[-1].replace('.sh','') for f in glob.glob('configs/*.sh')]
print('Configs found:', configs)
"
Serving-Config Resolver (fail-closed)
Run the deterministic resolver over the blueprint's sidecar. Exit code 2 = hard-rule FAIL (must fix the sidecar before deploying); 0 = clean. WARN/INFO and prior-failure:* corpus findings do not block but must be read.
python3 standards/serving-commons/resolver/validate-serving-config.py \
--sidecar domains/gpu-serving/blueprints/<name>/benchmark.yaml \
--corpus-root .
This codifies the FP8/TP, max-model-len, AMI, LMCache/MLA, HiCache, and spec-decode rules — see standards/serving-commons/README.md. The model-load recovery notes below describe the symptoms; this gate catches them from the declared config first.
AgentCore Runtime Pre-Flight
Foundation
aws ec2 describe-vpc-endpoints --filters "Name=vpc-id,Values=<vpc_id>" \
--query 'VpcEndpoints[].ServiceName'
AgentCore Status
aws bedrock-agent get-agent --agent-id <id> --query 'agent.agentStatus'
aws bedrock-agent list-agent-aliases --agent-id <id>
Auth (Cognito)
aws cognito-idp describe-user-pool --user-pool-id <pool_id> --query 'UserPool.Status'
aws cognito-idp admin-get-user --user-pool-id <pool_id> --username test-user \
--query 'UserStatus'
Proxy (ECS)
aws ecs describe-services --cluster <cluster> --services <service> \
--query 'services[0].{desired:desiredCount,running:runningCount}'
Post-Deployment Verification
After each deployment stage, verify:
- Terraform outputs captured — record VPC ID, subnet IDs, cluster name, FSx DNS, ECR URIs
- Health endpoints responding —
curl <endpoint>/health returns 200
- Test request succeeds — single inference request returns valid output
- Logs flowing — check CloudWatch (ECS) or OTEL collector (AgentCore) for recent entries
- Monitoring active — Prometheus scraping targets, Grafana dashboards loading
Failure Recovery Playbooks
Capacity Block: InsufficientInstanceCapacity
Symptom: aws ec2 run-instances fails with InsufficientInstanceCapacity
Recovery:
- Shotgun launch across multiple regions: us-east-1, us-east-2, us-west-2
- Do NOT trust dry-run success as a capacity signal — it only validates permissions/quotas
- For scarce instance types (g7e), use on-demand or spot — capacity blocks may not be supported
- Consider bare EC2 over EKS when capacity is unpredictable
EKS: Node Fails to Join Cluster
Symptom: GPU instance launched but not visible in kubectl get nodes
Recovery:
- Check AMI type — AL2023 uses
nodeadm not bootstrap.sh
- Verify EKS access entry exists for the instance role
- Check security group allows communication with EKS API server
- For capacity block instances, create access entry manually:
aws eks create-access-entry --cluster-name <cluster> \
--principal-arn <instance-role-arn> --type EC2_LINUX
Container: nerdctl/containerd Issues on Bare EC2
Symptom: Container commands fail on EKS-optimized AMI outside EKS
Recovery:
- Start containerd:
sudo systemctl start containerd
- Use nerdctl, not docker:
nerdctl --gpus 4 run ...
- Do NOT combine
--rm with -d — nerdctl doesn't support this
- Expand root partition if needed:
growpart /dev/nvme0n1 1 && xfs_growfs /
Serving Stack: Model Fails to Load
Symptom: vLLM/SGLang pod crashes or hangs during model loading
Recovery:
- FP8 + MoE TP incompatibility: Verify all weight dimensions divisible by
block_k=128 at target TP. TP=8 on shared experts with input_size=512 → 64/partition → ValueError. Fall back to TP=4. This is now codified — the serving-config resolver (rule fp8-moe-tp-divisibility) catches it deterministically from the sidecar before deploy, given model.moe_intermediate_size. Reaching this recovery step means the pre-flight gate was skipped or the sidecar lacked moe_intermediate_size.
- Missing model in framework registry: Check
transformers.AutoConfig.from_pretrained() → architectures field. Verify model is in SGLang/vLLM registry.
- Hybrid architecture: Models with mamba layers trigger different cache mode. Prefix caching may conflict with MTP. Test with
--no-enable-prefix-caching if MTP is needed.
- JIT compilation startup: First launch with DeepGEMM/TensorRT can take 10-15 min. Wait for health endpoint, don't restart prematurely.
AgentCore: Runtime Status FAILED
Symptom: get-agent returns status FAILED
Recovery:
- Get failure reason:
aws bedrock-agent get-agent --agent-id <id> --query 'agent.failureReasons'
- Common causes:
- Missing VPC endpoint for
bedrock-runtime
- IAM role missing
bedrock:InvokeModel
- Foundation model not available in region
- Fix the cause, then re-apply:
terraform apply -target=module.agentcore_runtime
- After update, pin endpoint version:
aws bedrock-agent update-agent-runtime-endpoint \
--agent-runtime-id <id> --agent-runtime-version <N>
Terraform: State Lock Conflict
Symptom: Error acquiring the state lock
Recovery:
- Find orphaned processes:
ps aux | grep terraform
- Kill them:
pkill -9 terraform
- Force unlock:
terraform force-unlock <LOCK_ID>
- Prevention: never run terraform in parallel background tasks
Operational Artifacts
Every deployment must produce these artifacts in the blueprint's directory:
| Artifact | Path | When |
|---|
| Readiness audit | results/readiness-audit-<YYYYMMDD>.md | Before every capacity block or deployment |
| Deployment log | results/deployment-log-<YYYYMMDD>.md | During deployment (timestamped) |
| Lessons learned | lessons.md | After deployment (append-only) |
| Compound summary | results/compound-<YYYYMMDD>.md | After compound-learner runs |
| Benchmark report | results/benchmark-report.md | After benchmarks (if applicable) |
Success Criteria
| Metric | Target | How to Measure |
|---|
| Skill triggers on deployment/checklist requests | 90%+ | Test with "pre-flight check", "readiness audit", "deployment failed" |
| Does NOT trigger on Terraform authoring | 0% false triggers | Test with "create VPC", "write terraform" |
| Pre-flight catches blocking issues | 100% | Run checklist against a known-broken deployment |
| Recovery playbook resolves issue | 80%+ | Track whether suggested fix works without user correction |
| All artifacts generated per deployment | 100% | Verify all 4 artifact files exist after deployment |