{ "$schema": "https://hwlab.pikastech.local/schemas/dev-gate-report.schema.json", "$id": "https://hwlab.pikastech.local/reports/dev-gate/dev-deploy-report.json", "reportVersion": "v1", "issue": "pikasTech/HWLAB#33", "supports": [ "pikasTech/HWLAB#50", "pikasTech/HWLAB#7", "pikasTech/HWLAB#33", "pikasTech/HWLAB#17", "pikasTech/HWLAB#32", "pikasTech/HWLAB#30" ], "taskId": "dev-deploy-apply", "commitId": "845133ae149a", "acceptanceLevel": "dev_deploy_apply", "devOnly": true, "prodDisabled": true, "status": "blocked", "generatedAt": "2026-05-21T17:47:32.687Z", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:6667", "sourceContract": { "status": "pass", "documents": [ "docs/dev-acceptance-matrix.md", "docs/m0-contract-audit.md", "docs/dev-deploy-apply.md", "docs/artifact-catalog.md", "deploy/README.md" ], "summary": "DEV deploy apply is pinned to hwlab-dev and the frozen HWLAB service IDs" }, "validationCommands": [ "node --check scripts/validate-dev-gate-report.mjs", "node scripts/validate-dev-gate-report.mjs", "node --check scripts/dev-deploy-apply.mjs", "node --check scripts/src/dev-deploy-apply.mjs", "node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked" ], "localSmoke": { "status": "not_run", "commands": [ "node scripts/m1-contract-smoke.mjs" ], "evidence": [ "This deploy apply task did not run local smoke because artifact/executor blockers stop promotion first." ], "summary": "Local smoke remains available but is not a substitute for DEV artifact publish evidence." }, "dryRun": { "status": "blocked", "commands": [ "node tools/hwlab-cli/bin/hwlab-cli.mjs test e2e --env dev --mvp --dry-run", "node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked" ], "evidence": [ "artifact services checked: 13", "expected artifact commit: 24eb3bf", "namespace: hwlab-dev", "workloads planned: 13", "kubectl executor: missing", "live health: blocked" ], "summary": "DEV apply is blocked before mutation." }, "devPreconditions": { "status": "blocked", "requirements": [ "DEV artifact catalog must contain CI publish evidence and registry digests", "kubectl must be available for D601 hwlab-dev and must not target PROD", "hwlab-cloud-api /health/live must report serviceId, dev environment, and DB connectivity", "pods, services, configmaps, and image commit tags must be observable in hwlab-dev" ], "summary": "One or more required DEV deploy preconditions are blocked." }, "devDeployApply": { "mode": "dry-run", "conclusion": { "status": "blocked", "reason": "6 blocker(s) must be cleared before any live DEV apply.", "blockerCount": 6 }, "applyBoundary": { "currentMode": "dry-run", "defaultNoWrite": true, "mutationAttempted": false, "mutationAllowed": false, "applyRequiresFlags": [ "--apply", "--confirm-dev", "--confirmed-non-production" ], "writeScope": "kubectl apply -k deploy/k8s/dev, namespace hwlab-dev only", "noWriteScope": "source/catalog/k8s validation, optional DEV health probe, kubectl read, and server-side dry-run only", "forbiddenActions": [ "prod-deploy", "secret-read", "runtime-substitute", "unidesk-restart", "code-queue-restart", "backend-core-restart", "heavy-master-e2e", "force-push" ] }, "mutationAttempted": false, "target": { "environment": "dev", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:6667", "prodDisabled": true }, "artifactPlan": { "expectedArtifactCommit": "24eb3bf", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "sourceCommitId": "845133ae149a", "serviceCommitIds": [ "24eb3bf" ], "matchesSourceCommit": false, "published": false, "registryVerified": false, "imageCount": 13, "unpublishedServices": [ "hwlab-cloud-api", "hwlab-cloud-web", "hwlab-agent-mgr", "hwlab-agent-worker", "hwlab-gateway", "hwlab-gateway-simu", "hwlab-box-simu", "hwlab-patch-panel", "hwlab-router", "hwlab-tunnel-client", "hwlab-edge-proxy", "hwlab-cli", "hwlab-agent-skills" ] }, "workloadPlan": [ { "kind": "Deployment", "name": "hwlab-cloud-api", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-cloud-api" ], "containers": [ { "name": "hwlab-cloud-api", "serviceId": "hwlab-cloud-api", "image": "ghcr.io/pikastech/hwlab-cloud-api:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-cloud-web", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-cloud-web" ], "containers": [ { "name": "hwlab-cloud-web", "serviceId": "hwlab-cloud-web", "image": "ghcr.io/pikastech/hwlab-cloud-web:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-agent-mgr", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-agent-mgr" ], "containers": [ { "name": "hwlab-agent-mgr", "serviceId": "hwlab-agent-mgr", "image": "ghcr.io/pikastech/hwlab-agent-mgr:24eb3bf" } ] }, { "kind": "Job", "name": "hwlab-agent-worker-template", "namespace": "hwlab-dev", "replicas": 0, "serviceIds": [ "hwlab-agent-worker" ], "containers": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", "image": "ghcr.io/pikastech/hwlab-agent-worker:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-gateway", "namespace": "hwlab-dev", "replicas": 0, "serviceIds": [ "hwlab-gateway" ], "containers": [ { "name": "hwlab-gateway", "serviceId": "hwlab-gateway", "image": "ghcr.io/pikastech/hwlab-gateway:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-gateway-simu", "namespace": "hwlab-dev", "replicas": 2, "serviceIds": [ "hwlab-gateway-simu" ], "containers": [ { "name": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", "image": "ghcr.io/pikastech/hwlab-gateway-simu:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-box-simu", "namespace": "hwlab-dev", "replicas": 2, "serviceIds": [ "hwlab-box-simu" ], "containers": [ { "name": "hwlab-box-simu", "serviceId": "hwlab-box-simu", "image": "ghcr.io/pikastech/hwlab-box-simu:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-patch-panel", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-patch-panel" ], "containers": [ { "name": "hwlab-patch-panel", "serviceId": "hwlab-patch-panel", "image": "ghcr.io/pikastech/hwlab-patch-panel:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-router", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-router" ], "containers": [ { "name": "hwlab-router", "serviceId": "hwlab-router", "image": "ghcr.io/pikastech/hwlab-router:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-tunnel-client", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-tunnel-client" ], "containers": [ { "name": "hwlab-tunnel-client", "serviceId": "hwlab-tunnel-client", "image": "ghcr.io/pikastech/hwlab-tunnel-client:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-edge-proxy", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-edge-proxy" ], "containers": [ { "name": "hwlab-edge-proxy", "serviceId": "hwlab-edge-proxy", "image": "ghcr.io/pikastech/hwlab-edge-proxy:24eb3bf" } ] }, { "kind": "Job", "name": "hwlab-cli-template", "namespace": "hwlab-dev", "replicas": 0, "serviceIds": [ "hwlab-cli" ], "containers": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", "image": "ghcr.io/pikastech/hwlab-cli:24eb3bf" } ] }, { "kind": "Deployment", "name": "hwlab-agent-skills", "namespace": "hwlab-dev", "replicas": 1, "serviceIds": [ "hwlab-agent-skills" ], "containers": [ { "name": "hwlab-agent-skills", "serviceId": "hwlab-agent-skills", "image": "ghcr.io/pikastech/hwlab-agent-skills:24eb3bf" } ] } ], "servicePlan": [ { "kind": "Service", "name": "hwlab-cloud-api", "namespace": "hwlab-dev", "serviceId": "hwlab-cloud-api", "type": "ClusterIP", "ports": [ { "name": "http", "port": 6667, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-cloud-web", "namespace": "hwlab-dev", "serviceId": "hwlab-cloud-web", "type": "ClusterIP", "ports": [ { "name": "http", "port": 8080, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-gateway", "namespace": "hwlab-dev", "serviceId": "hwlab-gateway", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7001, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-cli", "namespace": "hwlab-dev", "serviceId": "hwlab-cli", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7501, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-agent-skills", "namespace": "hwlab-dev", "serviceId": "hwlab-agent-skills", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7502, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-agent-mgr", "namespace": "hwlab-dev", "serviceId": "hwlab-agent-mgr", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7410, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-gateway-simu", "namespace": "hwlab-dev", "serviceId": "hwlab-gateway-simu", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7101, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-box-simu", "namespace": "hwlab-dev", "serviceId": "hwlab-box-simu", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7201, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-patch-panel", "namespace": "hwlab-dev", "serviceId": "hwlab-patch-panel", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7301, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-router", "namespace": "hwlab-dev", "serviceId": "hwlab-router", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7401, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-tunnel-client", "namespace": "hwlab-dev", "serviceId": "hwlab-tunnel-client", "type": "ClusterIP", "ports": [ { "name": "http", "port": 7402, "targetPort": "http" } ] }, { "kind": "Service", "name": "hwlab-edge-proxy", "namespace": "hwlab-dev", "serviceId": "hwlab-edge-proxy", "type": "ClusterIP", "ports": [ { "name": "http", "port": 6667, "targetPort": "http" } ] } ], "applyStep": { "status": "not_run", "summary": "Skipped because preflight blockers are open" }, "manualCommands": { "status": "blocked", "beforeHumanApproval": [ "node scripts/dev-deploy-apply.mjs --dry-run --expect-blocked --write-report", "node scripts/validate-dev-gate-report.mjs" ], "afterHumanApproval": [], "summary": "No apply command is offered while blockers remain open." }, "rollbackHint": { "namespace": "hwlab-dev", "strategy": "DEV-only Kubernetes rollback using deployment revision history; do not touch PROD or UniDesk services.", "captureBeforeApply": [ "kubectl -n hwlab-dev get pods,services,configmaps,deployments,jobs -o wide", "kubectl -n hwlab-dev get deployments -o json" ], "deploymentRollbackCommands": [ "kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-api", "kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-web", "kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-mgr", "kubectl -n hwlab-dev rollout undo deployment/hwlab-gateway", "kubectl -n hwlab-dev rollout undo deployment/hwlab-gateway-simu", "kubectl -n hwlab-dev rollout undo deployment/hwlab-box-simu", "kubectl -n hwlab-dev rollout undo deployment/hwlab-patch-panel", "kubectl -n hwlab-dev rollout undo deployment/hwlab-router", "kubectl -n hwlab-dev rollout undo deployment/hwlab-tunnel-client", "kubectl -n hwlab-dev rollout undo deployment/hwlab-edge-proxy", "kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-skills" ], "jobCleanupCommands": [ "kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found", "kubectl -n hwlab-dev delete job hwlab-cli-template --ignore-not-found" ], "postRollbackChecks": [ "kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-api --timeout=120s", "curl -fsS http://74.48.78.17:6667/health/live" ] }, "remainingBlockers": [ { "type": "observability_blocker", "scope": "artifact-source-commit", "status": "open", "summary": "deploy/catalog artifact commit 24eb3bf/24eb3bf does not match source 845133ae149a", "unblockHint": "Regenerate deploy/deploy.json and deploy/artifact-catalog.dev.json for the source commit that will be promoted." }, { "type": "observability_blocker", "scope": "artifact-publish", "status": "open", "summary": "DEV artifact catalog has no CI publish, registry verification, or registry digests", "unblockHint": "Publish DEV images from the intended commit and update the catalog with registry digests and verification evidence." }, { "type": "runtime_blocker", "scope": "cloud-api-db-config", "status": "open", "summary": "cloud-api has no DEV DB connection env configured", "unblockHint": "Configure and verify the DEV cloud-api DB connection through health output, without reading secret values." }, { "type": "runtime_blocker", "scope": "cloud-api-db", "status": "open", "summary": "cloud-api health reports DB not connected in this artifact", "unblockHint": "Configure and verify the DEV cloud-api DB connection through health output, without reading secret values." }, { "type": "environment_blocker", "scope": "kubectl", "status": "open", "summary": "kubectl is not installed in the runner", "unblockHint": "Provide a kubectl client configured for the D601 DEV k3s context without exposing token or secret values." }, { "type": "network_blocker", "scope": "dev-health", "status": "open", "summary": "Cannot reach http://74.48.78.17:6667/health/live: connect ECONNREFUSED 74.48.78.17:6667", "unblockHint": "Restore the public DEV health path and confirm it identifies HWLAB dev, not a substitute runtime." } ], "artifactEvidence": [ { "serviceId": "hwlab-cloud-api", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-cloud-api:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-cloud-web", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-cloud-web:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-agent-mgr", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-agent-mgr:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-agent-worker", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-agent-worker:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-gateway", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-gateway:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-gateway-simu", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-gateway-simu:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-box-simu", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-box-simu:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-patch-panel", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-patch-panel:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-router", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-router:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-tunnel-client", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-tunnel-client:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-edge-proxy", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-edge-proxy:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-cli", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-cli:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" }, { "serviceId": "hwlab-agent-skills", "deployCommitId": "24eb3bf", "catalogCommitId": "24eb3bf", "image": "ghcr.io/pikastech/hwlab-agent-skills:24eb3bf", "digest": "not_published", "publishState": "skeleton-only" } ], "k8sManifest": { "resourceCounts": { "workloads": 13, "services": 12, "configMaps": 1 }, "images": [ { "serviceId": "hwlab-cloud-api", "image": "ghcr.io/pikastech/hwlab-cloud-api:24eb3bf", "kind": "Deployment", "name": "hwlab-cloud-api" }, { "serviceId": "hwlab-cloud-web", "image": "ghcr.io/pikastech/hwlab-cloud-web:24eb3bf", "kind": "Deployment", "name": "hwlab-cloud-web" }, { "serviceId": "hwlab-agent-mgr", "image": "ghcr.io/pikastech/hwlab-agent-mgr:24eb3bf", "kind": "Deployment", "name": "hwlab-agent-mgr" }, { "serviceId": "hwlab-agent-worker", "image": "ghcr.io/pikastech/hwlab-agent-worker:24eb3bf", "kind": "Job", "name": "hwlab-agent-worker-template" }, { "serviceId": "hwlab-gateway", "image": "ghcr.io/pikastech/hwlab-gateway:24eb3bf", "kind": "Deployment", "name": "hwlab-gateway" }, { "serviceId": "hwlab-gateway-simu", "image": "ghcr.io/pikastech/hwlab-gateway-simu:24eb3bf", "kind": "Deployment", "name": "hwlab-gateway-simu" }, { "serviceId": "hwlab-box-simu", "image": "ghcr.io/pikastech/hwlab-box-simu:24eb3bf", "kind": "Deployment", "name": "hwlab-box-simu" }, { "serviceId": "hwlab-patch-panel", "image": "ghcr.io/pikastech/hwlab-patch-panel:24eb3bf", "kind": "Deployment", "name": "hwlab-patch-panel" }, { "serviceId": "hwlab-router", "image": "ghcr.io/pikastech/hwlab-router:24eb3bf", "kind": "Deployment", "name": "hwlab-router" }, { "serviceId": "hwlab-tunnel-client", "image": "ghcr.io/pikastech/hwlab-tunnel-client:24eb3bf", "kind": "Deployment", "name": "hwlab-tunnel-client" }, { "serviceId": "hwlab-edge-proxy", "image": "ghcr.io/pikastech/hwlab-edge-proxy:24eb3bf", "kind": "Deployment", "name": "hwlab-edge-proxy" }, { "serviceId": "hwlab-cli", "image": "ghcr.io/pikastech/hwlab-cli:24eb3bf", "kind": "Job", "name": "hwlab-cli-template" }, { "serviceId": "hwlab-agent-skills", "image": "ghcr.io/pikastech/hwlab-agent-skills:24eb3bf", "kind": "Deployment", "name": "hwlab-agent-skills" } ] }, "clusterObservation": { "status": "blocked", "executor": "missing", "resources": [] }, "liveProbe": { "status": "blocked", "url": "http://74.48.78.17:6667/health/live", "error": "connect ECONNREFUSED 74.48.78.17:6667" } }, "blockers": [ { "type": "observability_blocker", "scope": "artifact-source-commit", "status": "open", "summary": "deploy/catalog artifact commit 24eb3bf/24eb3bf does not match source 845133ae149a" }, { "type": "observability_blocker", "scope": "artifact-publish", "status": "open", "summary": "DEV artifact catalog has no CI publish, registry verification, or registry digests" }, { "type": "runtime_blocker", "scope": "cloud-api-db-config", "status": "open", "summary": "cloud-api has no DEV DB connection env configured" }, { "type": "runtime_blocker", "scope": "cloud-api-db", "status": "open", "summary": "cloud-api health reports DB not connected in this artifact" }, { "type": "environment_blocker", "scope": "kubectl", "status": "open", "summary": "kubectl is not installed in the runner" }, { "type": "network_blocker", "scope": "dev-health", "status": "open", "summary": "Cannot reach http://74.48.78.17:6667/health/live: connect ECONNREFUSED 74.48.78.17:6667" } ], "notes": "DEV-only result. No PROD resources, secret values, force push, heavy e2e, browser e2e, or UniDesk runtime substitute were used." }