diff --git a/reports/dev-gate/dev-deploy-report.json b/reports/dev-gate/dev-deploy-report.json index ab7582e4..1daa83bc 100644 --- a/reports/dev-gate/dev-deploy-report.json +++ b/reports/dev-gate/dev-deploy-report.json @@ -4,6 +4,9 @@ "reportVersion": "v1", "issue": "pikasTech/HWLAB#33", "supports": [ + "pikasTech/HWLAB#164", + "pikasTech/HWLAB#143", + "pikasTech/HWLAB#99", "pikasTech/HWLAB#63", "pikasTech/HWLAB#50", "pikasTech/HWLAB#7", @@ -13,12 +16,20 @@ "pikasTech/HWLAB#30" ], "taskId": "dev-deploy-apply", - "commitId": "7e29522", + "commitId": "4d2a0ba", "acceptanceLevel": "dev_deploy_apply", "devOnly": true, "prodDisabled": true, + "reportLifecycle": { + "version": "v1", + "state": "active", + "activeEndpoint": "http://74.48.78.17:16667", + "activeBrowserEndpoint": "http://74.48.78.17:16666", + "deprecatedEndpoint": null, + "summary": "Current DEV deploy apply report; active public API/health endpoint is 16667 and browser endpoint is 16666." + }, "status": "pass", - "generatedAt": "2026-05-22T05:33:09.590Z", + "generatedAt": "2026-05-23T08:34:34.256Z", "namespace": "hwlab-dev", "endpoint": "http://74.48.78.17:16667", "sourceContract": { @@ -57,12 +68,17 @@ ], "evidence": [ "artifact services checked: 13", - "expected artifact commit: 7e29522", + "expected artifact commit: 4d2a0ba", "namespace: hwlab-dev", "workloads planned: 13", "kubectl executor: /usr/local/bin/kubectl", + "kubectl kubeconfig source: env:KUBECONFIG", + "kubectl kubeconfig: /var/lib/unidesk/code-queue/kubeconfig", "live health: pass", - "template job replacements: 2" + "code agent provider desired-state: pass", + "code agent provider live env before apply: pass", + "template job replacements: 2", + "legacy simulator deployment cleanups: 0" ], "summary": "DEV dry-run preflight passed." }, @@ -72,29 +88,31 @@ "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 env readiness without exposing secret values", + "hwlab-cloud-api must declare and preserve OPENAI_API_KEY from hwlab-code-agent-provider/openai-api-key plus the DEV Code Agent egress proxy env without reading Secret values", "pods, services, configmaps, and image commit tags must be observable in hwlab-dev" ], "summary": "DEV deploy preconditions are satisfied." }, "devDeployApply": { - "mode": "dry-run", + "mode": "apply", "conclusion": { "status": "ready", "reason": "All DEV-only preconditions passed; human approval is still required before apply.", "blockerCount": 0 }, "applyBoundary": { - "currentMode": "dry-run", - "defaultNoWrite": true, - "mutationAttempted": false, - "mutationAllowed": false, + "currentMode": "apply-requested", + "defaultNoWrite": false, + "mutationAttempted": true, + "mutationAllowed": true, "applyRequiresFlags": [ "--apply", "--confirm-dev", "--confirmed-non-production" ], - "writeScope": "kubectl apply -k deploy/k8s/dev, namespace hwlab-dev only; delete/recreate is allowed only for explicitly allowlisted suspended DEV template Jobs", - "noWriteScope": "source/catalog/k8s validation, optional DEV health probe, kubectl read, replacement planning, and server-side dry-run only", + "kubeconfigSource": "env:KUBECONFIG", + "writeScope": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl apply -k deploy/k8s/dev, namespace hwlab-dev only; delete/recreate is allowed only for explicitly allowlisted suspended DEV template Jobs and stale legacy simulator Deployments", + "noWriteScope": "source/catalog/k8s validation, optional DEV health probe, KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl read, replacement planning, and server-side dry-run only", "forbiddenActions": [ "prod-deploy", "secret-read", @@ -106,7 +124,7 @@ "force-push" ] }, - "mutationAttempted": false, + "mutationAttempted": true, "target": { "environment": "dev", "namespace": "hwlab-dev", @@ -114,12 +132,12 @@ "prodDisabled": true }, "artifactPlan": { - "expectedArtifactCommit": "7e29522", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "sourceCommitId": "7e29522", + "expectedArtifactCommit": "4d2a0ba", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "sourceCommitId": "4d2a0ba", "serviceCommitIds": [ - "7e29522" + "4d2a0ba" ], "matchesSourceCommit": true, "published": true, @@ -142,7 +160,7 @@ { "name": "hwlab-cloud-api", "serviceId": "hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:4d2a0ba" } ] }, @@ -158,7 +176,7 @@ { "name": "hwlab-cloud-web", "serviceId": "hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba" } ] }, @@ -174,7 +192,7 @@ { "name": "hwlab-agent-mgr", "serviceId": "hwlab-agent-mgr", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:4d2a0ba" } ] }, @@ -190,7 +208,7 @@ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba" } ] }, @@ -206,12 +224,12 @@ { "name": "hwlab-gateway", "serviceId": "hwlab-gateway", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:4d2a0ba" } ] }, { - "kind": "Deployment", + "kind": "StatefulSet", "name": "hwlab-gateway-simu", "namespace": "hwlab-dev", "replicas": 2, @@ -222,12 +240,12 @@ { "name": "hwlab-gateway-simu", "serviceId": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba" } ] }, { - "kind": "Deployment", + "kind": "StatefulSet", "name": "hwlab-box-simu", "namespace": "hwlab-dev", "replicas": 2, @@ -238,7 +256,7 @@ { "name": "hwlab-box-simu", "serviceId": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba" } ] }, @@ -254,7 +272,7 @@ { "name": "hwlab-patch-panel", "serviceId": "hwlab-patch-panel", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:4d2a0ba" } ] }, @@ -270,7 +288,7 @@ { "name": "hwlab-router", "serviceId": "hwlab-router", - "image": "127.0.0.1:5000/hwlab/hwlab-router:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-router:4d2a0ba" } ] }, @@ -286,7 +304,7 @@ { "name": "hwlab-tunnel-client", "serviceId": "hwlab-tunnel-client", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:4d2a0ba" } ] }, @@ -302,7 +320,7 @@ { "name": "hwlab-edge-proxy", "serviceId": "hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:4d2a0ba" } ] }, @@ -318,7 +336,7 @@ { "name": "hwlab-cli", "serviceId": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba" } ] }, @@ -334,7 +352,7 @@ { "name": "hwlab-agent-skills", "serviceId": "hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:4d2a0ba" } ] } @@ -354,6 +372,34 @@ } ] }, + { + "kind": "Service", + "name": "hwlab-gateway-simu-1", + "namespace": "hwlab-dev", + "serviceId": "hwlab-gateway-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7101, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-gateway-simu-2", + "namespace": "hwlab-dev", + "serviceId": "hwlab-gateway-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7101, + "targetPort": "http" + } + ] + }, { "kind": "Service", "name": "hwlab-cloud-web", @@ -368,6 +414,34 @@ } ] }, + { + "kind": "Service", + "name": "hwlab-box-simu-1", + "namespace": "hwlab-dev", + "serviceId": "hwlab-box-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7201, + "targetPort": "http" + } + ] + }, + { + "kind": "Service", + "name": "hwlab-box-simu-2", + "namespace": "hwlab-dev", + "serviceId": "hwlab-box-simu", + "type": "ClusterIP", + "ports": [ + { + "name": "http", + "port": 7201, + "targetPort": "http" + } + ] + }, { "kind": "Service", "name": "hwlab-gateway", @@ -534,25 +608,28 @@ "desiredSuspended": true, "liveExists": true, "liveSuspended": true, - "oldImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:cb35ada", - "newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522", + "oldImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:2343328", + "newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba", "oldImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:cb35ada" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:2343328" } ], "newImages": [ { "name": "hwlab-agent-worker", "serviceId": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba" } ], "replace": true, - "result": "planned", - "reason": "Live suspended template Job image differs from the desired manifest; delete/recreate is required because spec.template is immutable." + "result": "replaced", + "reason": "Live suspended template Job was deleted and recreated by kubectl apply.", + "deleteCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found=true", + "deleteStdout": "job.batch \"hwlab-agent-worker-template\" deleted from hwlab-dev namespace", + "deleteStderr": "" }, { "namespace": "hwlab-dev", @@ -561,38 +638,500 @@ "desiredSuspended": true, "liveExists": true, "liveSuspended": true, - "oldImage": "127.0.0.1:5000/hwlab/hwlab-cli:cb35ada", - "newImage": "127.0.0.1:5000/hwlab/hwlab-cli:7e29522", + "oldImage": "127.0.0.1:5000/hwlab/hwlab-cli:2343328", + "newImage": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba", "oldImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:cb35ada" + "image": "127.0.0.1:5000/hwlab/hwlab-cli:2343328" } ], "newImages": [ { "name": "hwlab-cli", "serviceId": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:7e29522" + "image": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba" } ], "replace": true, - "result": "planned", - "reason": "Live suspended template Job image differs from the desired manifest; delete/recreate is required because spec.template is immutable." + "result": "replaced", + "reason": "Live suspended template Job was deleted and recreated by kubectl apply.", + "deleteCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev delete job hwlab-cli-template --ignore-not-found=true", + "deleteStdout": "job.batch \"hwlab-cli-template\" deleted from hwlab-dev namespace", + "deleteStderr": "" } ], + "legacySimulatorDeploymentCleanupPolicy": { + "status": "active", + "namespace": "hwlab-dev", + "scope": "DEV-only stale simulator Deployments replaced by indexed StatefulSets", + "allowedDeployments": [ + { + "name": "hwlab-gateway-simu", + "serviceId": "hwlab-gateway-simu", + "replacementKind": "StatefulSet", + "reason": "M3 DEV requires exactly two indexed gateway-simu identities/sessions" + }, + { + "name": "hwlab-box-simu", + "serviceId": "hwlab-box-simu", + "replacementKind": "StatefulSet", + "reason": "M3 DEV requires exactly two indexed box-simu resource identities" + } + ] + }, + "legacySimulatorDeploymentCleanups": [ + { + "namespace": "hwlab-dev", + "deploymentName": "hwlab-gateway-simu", + "serviceId": "hwlab-gateway-simu", + "allowed": true, + "desiredReplacementExists": true, + "desiredReplacementKind": "StatefulSet", + "liveExists": false, + "oldImage": null, + "newImage": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", + "oldImages": [], + "newImages": [ + { + "name": "hwlab-gateway-simu", + "serviceId": "hwlab-gateway-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba" + } + ], + "cleanup": false, + "result": "not_found", + "reason": "Live legacy Deployment is absent; no cleanup is needed." + }, + { + "namespace": "hwlab-dev", + "deploymentName": "hwlab-box-simu", + "serviceId": "hwlab-box-simu", + "allowed": true, + "desiredReplacementExists": true, + "desiredReplacementKind": "StatefulSet", + "liveExists": false, + "oldImage": null, + "newImage": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", + "oldImages": [], + "newImages": [ + { + "name": "hwlab-box-simu", + "serviceId": "hwlab-box-simu", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba" + } + ], + "cleanup": false, + "result": "not_found", + "reason": "Live legacy Deployment is absent; no cleanup is needed." + } + ], + "cloudWebRollout": { + "serviceId": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "status": "observed", + "observationPhase": "after_apply", + "sourceCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "imageTag": "4d2a0ba", + "digest": "sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200", + "repositoryDigest": null, + "publishState": "published", + "rolloutRevision": "30", + "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "imageMatchesDesired": true, + "expectedRuntimeEnv": { + "HWLAB_COMMIT_ID": "4d2a0ba", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "HWLAB_IMAGE_TAG": "4d2a0ba" + }, + "liveRuntimeEnv": { + "status": "match", + "matchesDesired": true, + "fields": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "4d2a0ba", + "actual": "4d2a0ba", + "status": "match" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "status": "match" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "4d2a0ba", + "actual": "4d2a0ba", + "status": "match" + } + ], + "drift": [] + }, + "runtimeEnvMatchesDesired": true, + "runtimeEnvDrift": [], + "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "kubeconfigSource": "env:KUBECONFIG" + }, + "cloudWebRolloutBeforeApply": { + "serviceId": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "status": "observed", + "observationPhase": "before_apply", + "sourceCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "imageTag": "4d2a0ba", + "digest": "sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200", + "repositoryDigest": null, + "publishState": "published", + "rolloutRevision": "29", + "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:2343328", + "imageMatchesDesired": false, + "expectedRuntimeEnv": { + "HWLAB_COMMIT_ID": "4d2a0ba", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "HWLAB_IMAGE_TAG": "4d2a0ba" + }, + "liveRuntimeEnv": { + "status": "drift", + "matchesDesired": false, + "fields": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "4d2a0ba", + "actual": "2343328", + "status": "drift" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:2343328", + "status": "drift" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "4d2a0ba", + "actual": "2343328", + "status": "drift" + } + ], + "drift": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "4d2a0ba", + "actual": "2343328", + "status": "drift" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:2343328", + "status": "drift" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "4d2a0ba", + "actual": "2343328", + "status": "drift" + } + ] + }, + "runtimeEnvMatchesDesired": false, + "runtimeEnvDrift": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "4d2a0ba", + "actual": "2343328", + "status": "drift" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:2343328", + "status": "drift" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "4d2a0ba", + "actual": "2343328", + "status": "drift" + } + ], + "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "kubeconfigSource": "env:KUBECONFIG" + }, + "cloudWebRolloutAfterApply": { + "serviceId": "hwlab-cloud-web", + "namespace": "hwlab-dev", + "status": "observed", + "observationPhase": "after_apply", + "sourceCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "imageTag": "4d2a0ba", + "digest": "sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200", + "repositoryDigest": null, + "publishState": "published", + "rolloutRevision": "30", + "liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "imageMatchesDesired": true, + "expectedRuntimeEnv": { + "HWLAB_COMMIT_ID": "4d2a0ba", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "HWLAB_IMAGE_TAG": "4d2a0ba" + }, + "liveRuntimeEnv": { + "status": "match", + "matchesDesired": true, + "fields": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "4d2a0ba", + "actual": "4d2a0ba", + "status": "match" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "status": "match" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "4d2a0ba", + "actual": "4d2a0ba", + "status": "match" + } + ], + "drift": [] + }, + "runtimeEnvMatchesDesired": true, + "runtimeEnvDrift": [], + "verificationCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "kubeconfigSource": "env:KUBECONFIG" + }, + "codeAgentProvider": { + "desiredState": { + "contractVersion": "v1", + "environment": "dev", + "provider": "openai-responses", + "model": "gpt-5.5", + "status": "pass", + "ready": true, + "requiredEnv": [ + { + "name": "HWLAB_CODE_AGENT_PROVIDER", + "deployPresent": true, + "workloadPresent": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "HWLAB_CODE_AGENT_MODEL", + "deployPresent": true, + "workloadPresent": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "OPENAI_API_KEY", + "deployPresent": true, + "workloadPresent": true, + "redacted": true, + "source": "k8s-secret-ref" + }, + { + "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "deployPresent": true, + "workloadPresent": true, + "redacted": true, + "source": "runtime-env" + } + ], + "secretRef": { + "env": "OPENAI_API_KEY", + "secretName": "hwlab-code-agent-provider", + "secretKey": "openai-api-key", + "deployPlaceholderPresent": true, + "workloadSecretRefPresent": true, + "present": true, + "redacted": true + }, + "egress": { + "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "target": "dev-egress-proxy", + "deployPresent": true, + "workloadPresent": true, + "deployMatchesDevProxy": true, + "workloadMatchesDevProxy": true, + "directPublicOpenAi": false, + "valueRedacted": true + }, + "missingDeployEnv": [], + "missingWorkloadEnv": [], + "deployMismatches": [], + "workloadMismatches": [], + "missingSecretRefs": [], + "missingEgressContract": [], + "secretMaterialRead": false, + "valuesRedacted": true, + "providerConnected": false, + "fixtureEvidence": false + }, + "liveBeforeApply": { + "phase": "before_apply", + "namespace": "hwlab-dev", + "serviceId": "hwlab-cloud-api", + "status": "pass", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "expectedSecretRef": "hwlab-code-agent-provider/openai-api-key", + "expectedEgressTarget": "dev-egress-proxy", + "secretValuesRead": false, + "kubernetesSecretDataRead": false, + "valuesRedacted": true, + "contractVersion": "v1", + "environment": "dev", + "provider": "openai-responses", + "model": "gpt-5.5", + "ready": true, + "requiredEnv": [ + { + "name": "HWLAB_CODE_AGENT_PROVIDER", + "present": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "HWLAB_CODE_AGENT_MODEL", + "present": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "OPENAI_API_KEY", + "present": true, + "redacted": true, + "source": "k8s-secret-ref" + }, + { + "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "present": true, + "redacted": true, + "source": "runtime-env" + } + ], + "missingEnv": [], + "mismatchedEnv": [], + "secretRef": { + "env": "OPENAI_API_KEY", + "secretName": "hwlab-code-agent-provider", + "secretKey": "openai-api-key", + "present": true, + "redacted": true + }, + "egress": { + "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "target": "dev-egress-proxy", + "present": true, + "matchesDevProxy": true, + "directPublicOpenAi": false, + "valueRedacted": true + }, + "secretMaterialRead": false, + "providerConnected": false, + "deployment": "hwlab-cloud-api", + "container": "hwlab-cloud-api", + "validationScope": "deployment-env-and-secretKeyRef-metadata-only" + }, + "liveAfterApply": { + "phase": "after_apply", + "namespace": "hwlab-dev", + "serviceId": "hwlab-cloud-api", + "status": "pass", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "expectedSecretRef": "hwlab-code-agent-provider/openai-api-key", + "expectedEgressTarget": "dev-egress-proxy", + "secretValuesRead": false, + "kubernetesSecretDataRead": false, + "valuesRedacted": true, + "contractVersion": "v1", + "environment": "dev", + "provider": "openai-responses", + "model": "gpt-5.5", + "ready": true, + "requiredEnv": [ + { + "name": "HWLAB_CODE_AGENT_PROVIDER", + "present": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "HWLAB_CODE_AGENT_MODEL", + "present": true, + "redacted": false, + "source": "runtime-env" + }, + { + "name": "OPENAI_API_KEY", + "present": true, + "redacted": true, + "source": "k8s-secret-ref" + }, + { + "name": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "present": true, + "redacted": true, + "source": "runtime-env" + } + ], + "missingEnv": [], + "mismatchedEnv": [], + "secretRef": { + "env": "OPENAI_API_KEY", + "secretName": "hwlab-code-agent-provider", + "secretKey": "openai-api-key", + "present": true, + "redacted": true + }, + "egress": { + "env": "HWLAB_CODE_AGENT_OPENAI_BASE_URL", + "target": "dev-egress-proxy", + "present": true, + "matchesDevProxy": true, + "directPublicOpenAi": false, + "valueRedacted": true + }, + "secretMaterialRead": false, + "providerConnected": false, + "deployment": "hwlab-cloud-api", + "container": "hwlab-cloud-api", + "validationScope": "deployment-env-and-secretKeyRef-metadata-only" + }, + "validationGate": "no-secret provider env/secretKeyRef preservation", + "providerCallAttempted": false, + "secretValuesRead": false, + "kubernetesSecretDataRead": false, + "valuesRedacted": true + }, "applyStep": { "status": "pass", - "command": "kubectl apply --dry-run=server -k deploy/k8s/dev", - "stdout": "namespace/hwlab-dev unchanged (server dry run)\nconfigmap/hwlab-dev-health-contract configured (server dry run)\nservice/hwlab-agent-mgr unchanged (server dry run)\nservice/hwlab-agent-skills unchanged (server dry run)\nservice/hwlab-box-simu unchanged (server dry run)\nservice/hwlab-cli unchanged (server dry run)\nservice/hwlab-cloud-api unchanged (server dry run)\nservice/hwlab-cloud-web unchanged (server dry run)\nservice/hwlab-edge-proxy unchanged (server dry run)\nservice/hwlab-gateway unchanged (server dry run)\nservice/hwlab-gateway-simu unchanged (server dry run)\nservice/hwlab-patch-panel unchanged (server dry run)\nservice/hwlab-router unchanged (server dry run)\nservice/hwlab-tunnel-client unchanged (server dry run)\ndeployment.apps/hwlab-agent-mgr configured (server dry run)\ndeployment.apps/hwlab-agent-skills configured (server dry run)\ndeployment.apps/hwlab-box-simu configured (server dry run)\ndeployment.apps/hwlab-cloud-api configured (server dry run)\ndeployment.apps/hwlab-cloud-web configured (server dry run)\ndeployment.apps/hwlab-edge-proxy configured (server dry run)\ndeployment.apps/hwlab-gateway configured (server dry run)\ndeployment.apps/hwlab-gateway-simu configured (server dry run)\ndeployment.apps/hwlab-patch-panel configured (server dry run)\ndeployment.apps/hwlab-router configured (server dry run)\ndeployment.apps/hwlab-tunnel-client configured (server dry run)", - "stderr": "# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.\n# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.\nError from server (Invalid): error when applying patch:\n{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/last-applied-configuration\":\"{\\\"apiVersion\\\":\\\"batch/v1\\\",\\\"kind\\\":\\\"Job\\\",\\\"metadata\\\":{\\\"annotations\\\":{},\\\"labels\\\":{\\\"app.kubernetes.io/name\\\":\\\"hwlab-agent-worker\\\",\\\"app.kubernetes.io/part-of\\\":\\\"hwlab\\\",\\\"hwlab.pikastech.local/environment\\\":\\\"dev\\\",\\\"hwlab.pikastech.local/profile\\\":\\\"dev\\\",\\\"hwlab.pikastech.local/service-id\\\":\\\"hwlab-agent-worker\\\"},\\\"name\\\":\\\"hwlab-agent-worker-template\\\",\\\"namespace\\\":\\\"hwlab-dev\\\"},\\\"spec\\\":{\\\"suspend\\\":true,\\\"template\\\":{\\\"metadata\\\":{\\\"labels\\\":{\\\"app.kubernetes.io/name\\\":\\\"hwlab-agent-worker\\\",\\\"app.kubernetes.io/part-of\\\":\\\"hwlab\\\",\\\"hwlab.pikastech.local/environment\\\":\\\"dev\\\",\\\"hwlab.pikastech.local/profile\\\":\\\"dev\\\",\\\"hwlab.pikastech.local/service-id\\\":\\\"hwlab-agent-worker\\\"}},\\\"spec\\\":{\\\"containers\\\":[{\\\"env\\\":[{\\\"name\\\":\\\"HWLAB_AGENT_SESSION_MODE\\\",\\\"value\\\":\\\"session-scoped\\\"}],\\\"image\\\":\\\"127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522\\\",\\\"name\\\":\\\"hwlab-agent-worker\\\"}],\\\"restartPolicy\\\":\\\"Never\\\"}}}}\\n\"}},\"spec\":{\"template\":{\"spec\":{\"$setElementOrder/containers\":[{\"name\":\"hwlab-agent-worker\"}],\"containers\":[{\"image\":\"127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522\",\"name\":\"hwlab-agent-worker\"}]}}}}\nto:\nResource: \"batch/v1, Resource=jobs\", GroupVersionKind: \"batch/v1, Kind=Job\"\nName: \"hwlab-agent-worker-template\", Namespace: \"hwlab-dev\"\nfor: \"deploy/k8s/dev\": error when patching \"deploy/k8s/dev\": Job.batch \"hwlab-agent-worker-template\" is invalid: spec.template: Invalid value: {\"labels\":{\"app.kubernetes.io/name\":\"hwlab-agent-worker\",\"app.kubernetes.io/part-of\":\"hwlab\",\"batch.kubernetes.io/controller-uid\":\"0f7b16d1-562b-40a3-8ff8-961c10d1b182\",\"batch.kubernetes.io/job-name\":\"hwlab-agent-worker-template\",\"controller-uid\":\"0f7b16d1-562b-40a3-8ff8-961c10d1b182\",\"hwlab.pikastech.local/environment\":\"dev\",\"hwlab.pikastech.local/profile\":\"dev\",\"hwlab.pikastech.local/service-id\":\"hwlab-agent-worker\",\"job-name\":\"hwlab-agent-worker-template\"},\"Spec\":{\"Volumes\":null,\"InitContainers\":null,\"Containers\":[{\"Name\":\"hwlab-agent-worker\",\"Image\":\"127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522\",\"Command\":null,\"Args\":null,\"WorkingDir\":\"\",\"Ports\":null,\"EnvFrom\":null,\"Env\":[{\"Name\":\"HWLAB_AGENT_SESSION_MODE\",\"Value\":\"session-scoped\",\"ValueFrom\":null}],\"Resources\":{\"Limits\":null,\"Requests\":null,\"Claims\":null},\"ResizePolicy\":null,\"RestartPolicy\":null,\"RestartPolicyRules\":null,\"VolumeMounts\":null,\"VolumeDevices\":null,\"LivenessProbe\":null,\"ReadinessProbe\":null,\"StartupProbe\":null,\"Lifecycle\":null,\"TerminationMessagePath\":\"/dev/termination-log\",\"TerminationMessagePolicy\":\"File\",\"ImagePullPolicy\":\"IfNotPresent\",\"SecurityContext\":null,\"Stdin\":false,\"StdinOnce\":false,\"TTY\":false}],\"EphemeralContainers\":null,\"RestartPolicy\":\"Never\",\"TerminationGracePeriodSeconds\":30,\"ActiveDeadlineSeconds\":null,\"DNSPolicy\":\"ClusterFirst\",\"NodeSelector\":null,\"ServiceAccountName\":\"\",\"AutomountServiceAccountToken\":null,\"NodeName\":\"\",\"SecurityContext\":{\"HostNetwork\":false,\"HostPID\":false,\"HostIPC\":false,\"ShareProcessNamespace\":null,\"HostUsers\":null,\"SELinuxOptions\":null,\"WindowsOptions\":null,\"RunAsUser\":null,\"RunAsGroup\":null,\"RunAsNonRoot\":null,\"SupplementalGroups\":null,\"SupplementalGroupsPolicy\":null,\"FSGroup\":null,\"FSGroupChangePolicy\":null,\"Sysctls\":null,\"SeccompProfile\":null,\"AppArmorProfile\":null,\"SELinuxChangePolicy\":null},\"ImagePullSecrets\":null,\"Hostname\":\"\",\"Subdomain\":\"\",\"SetHostnameAsFQDN\":null,\"Affinity\":null,\"SchedulerName\":\"default-scheduler\",\"Tolerations\":null,\"HostAliases\":null,\"PriorityClassName\":\"\",\"Priority\":null,\"PreemptionPolicy\":null,\"DNSConfig\":null,\"ReadinessGates\":null,\"RuntimeClassName\":null,\"Overhead\":null,\"EnableServiceLinks\":null,\"TopologySpreadConstraints\":null,\"OS\":null,\"SchedulingGates\":null,\"ResourceClaims\":null,\"Resources\":null,\"HostnameOverride\":null}}: field is immutable\nError from server (Invalid): error when applying patch:\n{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/last-applied-configuration\":\"{\\\"apiVersion\\\":\\\"batch/v1\\\",\\\"kind\\\":\\\"Job\\\",\\\"metadata\\\":{\\\"annotations\\\":{},\\\"labels\\\":{\\\"app.kubernetes.io/name\\\":\\\"hwlab-cli\\\",\\\"app.kubernetes.io/part-of\\\":\\\"hwlab\\\",\\\"hwlab.pikastech.local/activation\\\":\\\"manual\\\",\\\"hwlab.pikastech.local/environment\\\":\\\"dev\\\",\\\"hwlab.pikastech.local/profile\\\":\\\"dev\\\",\\\"hwlab.pikastech.local/service-id\\\":\\\"hwlab-cli\\\"},\\\"name\\\":\\\"hwlab-cli-template\\\",\\\"namespace\\\":\\\"hwlab-dev\\\"},\\\"spec\\\":{\\\"suspend\\\":true,\\\"template\\\":{\\\"metadata\\\":{\\\"labels\\\":{\\\"app.kubernetes.io/name\\\":\\\"hwlab-cli\\\",\\\"app.kubernetes.io/part-of\\\":\\\"hwlab\\\",\\\"hwlab.pikastech.local/environment\\\":\\\"dev\\\",\\\"hwlab.pikastech.local/profile\\\":\\\"dev\\\",\\\"hwlab.pikastech.local/service-id\\\":\\\"hwlab-cli\\\"}},\\\"spec\\\":{\\\"containers\\\":[{\\\"env\\\":[{\\\"name\\\":\\\"HWLAB_CLI_ENDPOINT\\\",\\\"value\\\":\\\"http://74.48.78.17:16667\\\"}],\\\"image\\\":\\\"127.0.0.1:5000/hwlab/hwlab-cli:7e29522\\\",\\\"name\\\":\\\"hwlab-cli\\\"}],\\\"restartPolicy\\\":\\\"Never\\\"}}}}\\n\"}},\"spec\":{\"template\":{\"spec\":{\"$setElementOrder/containers\":[{\"name\":\"hwlab-cli\"}],\"containers\":[{\"image\":\"127.0.0.1:5000/hwlab/hwlab-cli:7e29522\",\"name\":\"hwlab-cli\"}]}}}}\nto:\nResource: \"batch/v1, Resource=jobs\", GroupVersionKind: \"batch/v1, Kind=Job\"\nName: \"hwlab-cli-template\", Namespace: \"hwlab-dev\"\nfor: \"deploy/k8s/dev\": error when patching \"deploy/k8s/dev\": Job.batch \"hwlab-cli-template\" is invalid: spec.template: Invalid value: {\"labels\":{\"app.kubernetes.io/name\":\"hwlab-cli\",\"app.kubernetes.io/part-of\":\"hwlab\",\"batch.kubernetes.io/controller-uid\":\"ce763736-b67b-400c-8a09-5b3f62019b09\",\"batch.kubernetes.io/job-name\":\"hwlab-cli-template\",\"controller-uid\":\"ce763736-b67b-400c-8a09-5b3f62019b09\",\"hwlab.pikastech.local/environment\":\"dev\",\"hwlab.pikastech.local/profile\":\"dev\",\"hwlab.pikastech.local/service-id\":\"hwlab-cli\",\"job-name\":\"hwlab-cli-template\"},\"Spec\":{\"Volumes\":null,\"InitContainers\":null,\"Containers\":[{\"Name\":\"hwlab-cli\",\"Image\":\"127.0.0.1:5000/hwlab/hwlab-cli:7e29522\",\"Command\":null,\"Args\":null,\"WorkingDir\":\"\",\"Ports\":null,\"EnvFrom\":null,\"Env\":[{\"Name\":\"HWLAB_CLI_ENDPOINT\",\"Value\":\"http://74.48.78.17:16667\",\"ValueFrom\":null}],\"Resources\":{\"Limits\":null,\"Requests\":null,\"Claims\":null},\"ResizePolicy\":null,\"RestartPolicy\":null,\"RestartPolicyRules\":null,\"VolumeMounts\":null,\"VolumeDevices\":null,\"LivenessProbe\":null,\"ReadinessProbe\":null,\"StartupProbe\":null,\"Lifecycle\":null,\"TerminationMessagePath\":\"/dev/termination-log\",\"TerminationMessagePolicy\":\"File\",\"ImagePullPolicy\":\"IfNotPresent\",\"SecurityContext\":null,\"Stdin\":false,\"StdinOnce\":false,\"TTY\":false}],\"EphemeralContainers\":null,\"RestartPolicy\":\"Never\",\"TerminationGracePeriodSeconds\":30,\"ActiveDeadlineSeconds\":null,\"DNSPolicy\":\"ClusterFirst\",\"NodeSelector\":null,\"ServiceAccountName\":\"\",\"AutomountServiceAccountToken\":null,\"NodeName\":\"\",\"SecurityContext\":{\"HostNetwork\":false,\"HostPID\":false,\"HostIPC\":false,\"ShareProcessNamespace\":null,\"HostUsers\":null,\"SELinuxOptions\":null,\"WindowsOptions\":null,\"RunAsUser\":null,\"RunAsGroup\":null,\"RunAsNonRoot\":null,\"SupplementalGroups\":null,\"SupplementalGroupsPolicy\":null,\"FSGroup\":null,\"FSGroupChangePolicy\":null,\"Sysctls\":null,\"SeccompProfile\":null,\"AppArmorProfile\":null,\"SELinuxChangePolicy\":null},\"ImagePullSecrets\":null,\"Hostname\":\"\",\"Subdomain\":\"\",\"SetHostnameAsFQDN\":null,\"Affinity\":null,\"SchedulerName\":\"default-scheduler\",\"Tolerations\":null,\"HostAliases\":null,\"PriorityClassName\":\"\",\"Priority\":null,\"PreemptionPolicy\":null,\"DNSConfig\":null,\"ReadinessGates\":null,\"RuntimeClassName\":null,\"Overhead\":null,\"EnableServiceLinks\":null,\"TopologySpreadConstraints\":null,\"OS\":null,\"SchedulingGates\":null,\"ResourceClaims\":null,\"Resources\":null,\"HostnameOverride\":null}}: field is immutable", - "mutationAttempted": false, - "expectedImmutableTemplateJobDryRun": true, - "expectedImmutableTemplateJobs": [ - "hwlab-agent-worker-template", - "hwlab-cli-template" - ] + "command": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl apply -k deploy/k8s/dev", + "stdout": "namespace/hwlab-dev unchanged\nconfigmap/hwlab-dev-health-contract unchanged\nservice/hwlab-agent-mgr unchanged\nservice/hwlab-agent-skills unchanged\nservice/hwlab-box-simu unchanged\nservice/hwlab-box-simu-1 unchanged\nservice/hwlab-box-simu-2 unchanged\nservice/hwlab-cli unchanged\nservice/hwlab-cloud-api unchanged\nservice/hwlab-cloud-web unchanged\nservice/hwlab-edge-proxy unchanged\nservice/hwlab-gateway unchanged\nservice/hwlab-gateway-simu unchanged\nservice/hwlab-gateway-simu-1 unchanged\nservice/hwlab-gateway-simu-2 unchanged\nservice/hwlab-patch-panel unchanged\nservice/hwlab-router unchanged\nservice/hwlab-tunnel-client unchanged\ndeployment.apps/hwlab-agent-mgr configured\ndeployment.apps/hwlab-agent-skills configured\ndeployment.apps/hwlab-cloud-api configured\ndeployment.apps/hwlab-cloud-web configured\ndeployment.apps/hwlab-edge-proxy configured\ndeployment.apps/hwlab-gateway configured\ndeployment.apps/hwlab-patch-panel configured\ndeployment.apps/hwlab-router configured\ndeployment.apps/hwlab-tunnel-client configured\nstatefulset.apps/hwlab-box-simu configured\nstatefulset.apps/hwlab-gateway-simu configured\njob.batch/hwlab-agent-worker-template created\njob.batch/hwlab-cli-template created", + "stderr": "# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.\n# Warning: 'commonLabels' is deprecated. Please use 'labels' instead. Run 'kustomize edit fix' to update your Kustomization automatically.", + "mutationAttempted": true, + "expectedImmutableTemplateJobDryRun": false, + "expectedImmutableTemplateJobs": [] }, "manualCommands": { "status": "ready", @@ -609,28 +1148,26 @@ "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" + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev get pods,services,configmaps,deployments,jobs -o wide", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig 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" + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-api", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-web", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-mgr", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-gateway", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-patch-panel", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-router", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-tunnel-client", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout undo deployment/hwlab-edge-proxy", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig 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" + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig 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", + "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-api --timeout=120s", "curl -fsS http://74.48.78.17:16667/health/live" ] }, @@ -638,106 +1175,106 @@ "artifactEvidence": [ { "serviceId": "hwlab-cloud-api", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:7e29522", - "digest": "sha256:090b6f919be3b3c7594ca4073b193351689fc525f478b64d54d393725cb01ecf", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:4d2a0ba", + "digest": "sha256:a295d92e3e11c4a7f04d80b90c5a0f4e59ffd6a83c3aa3ed8f86e14db1a88b14", "publishState": "published" }, { "serviceId": "hwlab-cloud-web", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:7e29522", - "digest": "sha256:bc6e836b2bb796b30562ed3ae93d8534146a3b74a310906481c8641646d1b8f0", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "digest": "sha256:fe834adbfd8cf0ca7e514af6c71dfe7243540084f81e6ef124549e4071e1d200", "publishState": "published" }, { "serviceId": "hwlab-agent-mgr", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:7e29522", - "digest": "sha256:4d9b8944bc52012bb0a4a3a345f8939381d2804032e544d0c98f49fac0e46bfd", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:4d2a0ba", + "digest": "sha256:7df780347df148f1303c498f35aba19d9c10f2f86899e9729afda978e7a27b2d", "publishState": "published" }, { "serviceId": "hwlab-agent-worker", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522", - "digest": "sha256:2582176e2c35a2bfbce4edfd922749397d45f6f1f8c04d0394c501f7d87323ee", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba", + "digest": "sha256:21ff26ae035b97a181b3986f46d27305879502fb4aab30a94924ce9f8ab6bcd6", "publishState": "published" }, { "serviceId": "hwlab-gateway", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:7e29522", - "digest": "sha256:290341fd6e6f036aa953943072ad58e0d0cfcc0e13950e6090f941b3310755a6", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:4d2a0ba", + "digest": "sha256:cdb8c86de03d9c1ab2c224b5d50d4048a8336942e507793f9fd450020f91b028", "publishState": "published" }, { "serviceId": "hwlab-gateway-simu", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:7e29522", - "digest": "sha256:02627f880c7ddf2102e2255a43097d1f604cfb7a22215736e328287e27fc5f03", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", + "digest": "sha256:daae618cdc7fb176d7dc769956e3d5948d1abade09e35dd29daf9c86a37f8fd1", "publishState": "published" }, { "serviceId": "hwlab-box-simu", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:7e29522", - "digest": "sha256:e02c270c71f83a2f4624722bb84616bea8374ef43439f27bdce310e4baa8dcca", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", + "digest": "sha256:5ba916ed43a8e35e5052f16fd380a3e6004aea10b2e99b8375cc5ba6439702e7", "publishState": "published" }, { "serviceId": "hwlab-patch-panel", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:7e29522", - "digest": "sha256:f730323f83c62797f382932582a05df921045c86383dad7951f3d639b32456a9", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:4d2a0ba", + "digest": "sha256:7df24c38a83ccf743a155f8b913541a4d9224e0436c646206a9e5e4a9d43192f", "publishState": "published" }, { "serviceId": "hwlab-router", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-router:7e29522", - "digest": "sha256:7c40c573078a9c325402bd47b2eb78a46c0c80564a228cf7c9fcf0cfba5bc6d2", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-router:4d2a0ba", + "digest": "sha256:c918d15ebee2175e720ecb0c854701bed51a1e7753a996f9e69b99e8d530c77b", "publishState": "published" }, { "serviceId": "hwlab-tunnel-client", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:7e29522", - "digest": "sha256:b141dc88557b8f6391aa082fdb37c6f0db5bc3a76c97bb39ba00354a9208abd8", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:4d2a0ba", + "digest": "sha256:ba8e496adf33ba7478c563291b84df0d30958f70576b23a8083972a5e5884e23", "publishState": "published" }, { "serviceId": "hwlab-edge-proxy", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:7e29522", - "digest": "sha256:792505139793c3f3da7769f9dc9d1cb3203ff92797305b62e8f12207c69a9831", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:4d2a0ba", + "digest": "sha256:e07c05b6b06aef750d02d9f82a34f3b43a1a9df3a668fe60d348abe5931a6650", "publishState": "published" }, { "serviceId": "hwlab-cli", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:7e29522", - "digest": "sha256:43d1c175091bfb462eddd7dd22a780d6485d86bdb052c36b78201606f48fadc1", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba", + "digest": "sha256:3d5baeb3343b81f62f20c3ffd143e55a899a697ebb5f1ac294bf89ace550a367", "publishState": "published" }, { "serviceId": "hwlab-agent-skills", - "deployCommitId": "7e29522", - "catalogCommitId": "7e29522", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:7e29522", - "digest": "sha256:c75510038dc33196dc254472e78101d545c0d777a7b33b531f02b39faf2588b5", + "deployCommitId": "4d2a0ba", + "catalogCommitId": "4d2a0ba", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:4d2a0ba", + "digest": "sha256:fd88f8f2d2d43d4420c5f70306f5810cb756bea9c0b206410cb7fa694cb67ce1", "publishState": "published" } ], @@ -769,6 +1306,23 @@ "missingManifest": [], "missingK8s": [], "missingSecretRefs": [], + "mismatchedNonSecretEnv": [], + "missingDnsContract": [], + "dns": { + "ready": true, + "source": "optional-public-dns-alias", + "serviceName": "cloud-api-db", + "namespace": "hwlab-dev", + "port": 5432, + "portName": "postgres", + "requiredForReadiness": false, + "usedForProbe": false, + "servicePresent": false, + "secretMaterialRead": false, + "liveDbEvidence": false, + "missing": [], + "actual": {} + }, "runtimeHealth": { "status": "degraded", "ready": false, @@ -778,6 +1332,7 @@ "connectionChecked": false, "connectionAttempted": false, "connectionResult": "unknown", + "liveDbEvidence": false, "requiredEnv": [ { "name": "HWLAB_CLOUD_DB_URL", @@ -803,147 +1358,235 @@ "redacted": true } ], + "endpointSource": "secret-url-host", + "optionalPublicDnsAlias": { + "source": "optional-public-dns-alias", + "serviceName": "cloud-api-db", + "namespace": "hwlab-dev", + "port": 5432, + "portName": "postgres", + "requiredForReadiness": false, + "usedForProbe": false, + "envPresent": false, + "readyGate": "not_readiness_authority" + }, "connection": { "attempted": false, "result": "unknown", "endpointRedacted": true, "valueRedacted": true }, + "redaction": { + "valuesRedacted": true, + "endpointRedacted": true, + "valueRedacted": true, + "secretMaterialRead": false, + "secretRefsOnly": true + }, + "readinessLayers": { + "dns": { + "status": "not_proven", + "result": "unknown" + }, + "tcp": { + "status": "not_proven", + "result": "unknown" + }, + "ssl": { + "status": "not_proven", + "result": "unknown" + }, + "auth": { + "status": "not_proven", + "result": "unknown" + }, + "schema": { + "status": "not_proven", + "result": "unknown" + }, + "migration": { + "status": "not_proven", + "result": "unknown" + }, + "durability": { + "status": "not_proven", + "result": "unknown" + } + }, "blocker": null, - "liveDbEvidence": false, "fixtureEvidence": false }, "secretMaterialRead": false, "valuesRedacted": true, "liveDbEvidence": false, "fixtureEvidence": false, - "note": "This check records DB env/Secret reference presence only. It is not live DB evidence." + "note": "This check records DB env, Secret reference, and Secret URL host authority only. Optional cloud-api-db alias presence is diagnostic and is not live DB evidence." }, "k8sManifest": { "resourceCounts": { "workloads": 13, - "services": 12, + "services": 16, "configMaps": 1 }, "images": [ { "serviceId": "hwlab-cloud-api", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:4d2a0ba", "kind": "Deployment", "name": "hwlab-cloud-api" }, { "serviceId": "hwlab-cloud-web", - "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", "kind": "Deployment", "name": "hwlab-cloud-web" }, { "serviceId": "hwlab-agent-mgr", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:4d2a0ba", "kind": "Deployment", "name": "hwlab-agent-mgr" }, { "serviceId": "hwlab-agent-worker", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:4d2a0ba", "kind": "Job", "name": "hwlab-agent-worker-template" }, { "serviceId": "hwlab-gateway", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway:4d2a0ba", "kind": "Deployment", "name": "hwlab-gateway" }, { "serviceId": "hwlab-gateway-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:7e29522", - "kind": "Deployment", + "image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:4d2a0ba", + "kind": "StatefulSet", "name": "hwlab-gateway-simu" }, { "serviceId": "hwlab-box-simu", - "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:7e29522", - "kind": "Deployment", + "image": "127.0.0.1:5000/hwlab/hwlab-box-simu:4d2a0ba", + "kind": "StatefulSet", "name": "hwlab-box-simu" }, { "serviceId": "hwlab-patch-panel", - "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:4d2a0ba", "kind": "Deployment", "name": "hwlab-patch-panel" }, { "serviceId": "hwlab-router", - "image": "127.0.0.1:5000/hwlab/hwlab-router:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-router:4d2a0ba", "kind": "Deployment", "name": "hwlab-router" }, { "serviceId": "hwlab-tunnel-client", - "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:4d2a0ba", "kind": "Deployment", "name": "hwlab-tunnel-client" }, { "serviceId": "hwlab-edge-proxy", - "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:4d2a0ba", "kind": "Deployment", "name": "hwlab-edge-proxy" }, { "serviceId": "hwlab-cli", - "image": "127.0.0.1:5000/hwlab/hwlab-cli:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-cli:4d2a0ba", "kind": "Job", "name": "hwlab-cli-template" }, { "serviceId": "hwlab-agent-skills", - "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:7e29522", + "image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:4d2a0ba", "kind": "Deployment", "name": "hwlab-agent-skills" } + ], + "runtimeIdentityEnv": [ + { + "serviceId": "hwlab-cloud-web", + "kind": "Deployment", + "name": "hwlab-cloud-web", + "container": "hwlab-cloud-web", + "expected": { + "HWLAB_COMMIT_ID": "4d2a0ba", + "HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "HWLAB_IMAGE_TAG": "4d2a0ba" + }, + "status": "match", + "matchesDesired": true, + "fields": [ + { + "name": "HWLAB_COMMIT_ID", + "expected": "4d2a0ba", + "actual": "4d2a0ba", + "status": "match" + }, + { + "name": "HWLAB_IMAGE", + "expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:4d2a0ba", + "status": "match" + }, + { + "name": "HWLAB_IMAGE_TAG", + "expected": "4d2a0ba", + "actual": "4d2a0ba", + "status": "match" + } + ], + "drift": [] + } ] }, "clusterObservation": { "status": "pass", "executor": "/usr/local/bin/kubectl", + "kubeconfig": "/var/lib/unidesk/code-queue/kubeconfig", + "kubeconfigSource": "env:KUBECONFIG", + "commandPrefix": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl", + "readCommand": "KUBECONFIG=/var/lib/unidesk/code-queue/kubeconfig kubectl get pods,services,configmaps,deployments,jobs -n hwlab-dev -o json", "version": "clientVersion:\n buildDate: \"2026-05-12T09:54:35Z\"\n compiler: gc\n gitCommit: 756939600b9a7180fc2df6550a4585b638875e67\n gitTreeState: clean\n gitVersion: v1.36.1\n goVersion: go1.26.2\n major: \"1\"\n minor: \"36\"\n platform: linux/amd64\nkustomizeVersion: v5.8.1", "resources": [ { "kind": "Pod", - "name": "hwlab-agent-mgr-75544c7747-5dzt9", + "name": "hwlab-agent-mgr-6487c6d6c7-5xhdx", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-agent-skills-849d9976f4-2nsmw", + "name": "hwlab-agent-skills-56488f6b58-h8jkx", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-box-simu-55688cbcc7-pftxc", + "name": "hwlab-box-simu-0", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-box-simu-55688cbcc7-sq5fx", + "name": "hwlab-box-simu-1", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-cloud-api-f48dcdfb-9n6zh", + "name": "hwlab-cloud-api-794868f84d-q8mr7", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-cloud-web-cd9655b98-gxtmc", + "name": "hwlab-cloud-web-5c746559b6-p9ktp", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-edge-proxy-567f978cdd-8fwc8", + "name": "hwlab-edge-proxy-5fbb997574-njgwz", "phase": "Running" }, { @@ -953,27 +1596,27 @@ }, { "kind": "Pod", - "name": "hwlab-gateway-simu-699fd486b-j9pk7", + "name": "hwlab-gateway-simu-0", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-gateway-simu-699fd486b-phcgp", + "name": "hwlab-gateway-simu-1", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-patch-panel-757f9f44d5-7np8r", + "name": "hwlab-patch-panel-5d75c58559-w7dq7", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-router-5d9cbdf89b-p7r94", + "name": "hwlab-router-5777cb4d7d-kn8tz", "phase": "Running" }, { "kind": "Pod", - "name": "hwlab-tunnel-client-65c7858c8-wjqsh", + "name": "hwlab-tunnel-client-65f85d7c8d-rpqrb", "phase": "Running" }, { @@ -988,6 +1631,14 @@ "kind": "Service", "name": "hwlab-box-simu" }, + { + "kind": "Service", + "name": "hwlab-box-simu-1" + }, + { + "kind": "Service", + "name": "hwlab-box-simu-2" + }, { "kind": "Service", "name": "hwlab-cli" @@ -1012,6 +1663,14 @@ "kind": "Service", "name": "hwlab-gateway-simu" }, + { + "kind": "Service", + "name": "hwlab-gateway-simu-1" + }, + { + "kind": "Service", + "name": "hwlab-gateway-simu-2" + }, { "kind": "Service", "name": "hwlab-patch-panel" @@ -1048,12 +1707,6 @@ "readyReplicas": 1, "replicas": 1 }, - { - "kind": "Deployment", - "name": "hwlab-box-simu", - "readyReplicas": 2, - "replicas": 2 - }, { "kind": "Deployment", "name": "hwlab-cloud-api", @@ -1082,12 +1735,6 @@ "kind": "Deployment", "name": "hwlab-gateway" }, - { - "kind": "Deployment", - "name": "hwlab-gateway-simu", - "readyReplicas": 2, - "replicas": 2 - }, { "kind": "Deployment", "name": "hwlab-patch-panel", @@ -1120,17 +1767,9 @@ "status": "pass", "url": "http://74.48.78.17:16667/health/live", "httpStatus": 200, - "body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"degraded\",\"service\":{\"id\":\"hwlab-cloud-api\",\"role\":\"cloud-api\",\"healthPath\":\"/health\",\"livePath\":\"/health/live\"},\"commit\":{\"id\":\"cb35ada\",\"source\":\"runtime-env\"},\"image\":{\"reference\":\"127.0.0.1:5000/hwlab/hwlab-cloud-api:cb35ada\",\"tag\":\"cb35ada\",\"digest\":\"unknown\"},\"endpoint\":\"http://74.48.78.17:16667\",\"observedAt\":\"2026-05-22T05:33:08.461Z\",\"db\":{\"contractVersion\":\"v1\",\"environment\":\"dev\",\"connected\":false,\"connectionChecked\":false,\"c" + "body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"degraded\",\"ready\":false,\"readiness\":{\"contractVersion\":\"v3\",\"ready\":false,\"status\":\"degraded\",\"blockerCodes\":[\"runtime_durable_adapter_auth_blocked\"],\"blockers\":[{\"code\":\"runtime_durable_adapter_auth_blocked\",\"type\":\"runtime_blocker\",\"scope\":\"runtime-durable-adapter\",\"status\":\"open\",\"sourceIssue\":\"pikasTech/HWLAB#164\",\"summary\":\"Postgres runtime adapter reached the DB driver but authentication or authorization blocked the schema query\"" } }, "blockers": [], - "notes": "DEV-only result. No PROD resources, secret values, force push, heavy e2e, browser e2e, or UniDesk runtime substitute were used.", - "reportLifecycle": { - "version": "v1", - "state": "active", - "activeEndpoint": "http://74.48.78.17:16667", - "activeBrowserEndpoint": "http://74.48.78.17:16666", - "deprecatedEndpoint": null, - "summary": "Current DEV deploy apply report; active public API/health endpoint is 16667 and browser endpoint is 16666." - } + "notes": "DEV-only result. No PROD resources, secret values, force push, heavy e2e, browser e2e, or UniDesk runtime substitute were used." }