Files
pikasTech-HWLAB/reports/dev-gate/dev-deploy-report.json
T
2026-05-23 21:54:37 +00:00

1806 lines
58 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"$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#164",
"pikasTech/HWLAB#143",
"pikasTech/HWLAB#99",
"pikasTech/HWLAB#63",
"pikasTech/HWLAB#50",
"pikasTech/HWLAB#7",
"pikasTech/HWLAB#33",
"pikasTech/HWLAB#17",
"pikasTech/HWLAB#32",
"pikasTech/HWLAB#30"
],
"taskId": "dev-deploy-apply",
"commitId": "e6d4bd5",
"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-23T21:48:14.125Z",
"namespace": "hwlab-dev",
"endpoint": "http://74.48.78.17:16667",
"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": "pass",
"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: e6d4bd5",
"namespace: hwlab-dev",
"workloads planned: 13",
"kubectl executor: /usr/local/bin/kubectl",
"kubectl kubeconfig source: flag:--kubeconfig",
"kubectl kubeconfig: /etc/rancher/k3s/k3s.yaml",
"live health: pass",
"code agent provider desired-state: pass",
"code agent provider live env before apply: blocked",
"template job replacements: 2",
"legacy simulator deployment cleanups: 0"
],
"summary": "DEV dry-run preflight passed."
},
"devPreconditions": {
"status": "pass",
"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 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": "apply",
"conclusion": {
"status": "ready",
"reason": "All DEV-only preconditions passed; human approval is still required before apply.",
"blockerCount": 0
},
"applyBoundary": {
"currentMode": "apply-requested",
"defaultNoWrite": false,
"mutationAttempted": true,
"mutationAllowed": true,
"applyRequiresFlags": [
"--apply",
"--confirm-dev",
"--confirmed-non-production"
],
"kubeconfigSource": "flag:--kubeconfig",
"writeScope": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml 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=/etc/rancher/k3s/k3s.yaml kubectl read, replacement planning, 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": true,
"target": {
"environment": "dev",
"namespace": "hwlab-dev",
"endpoint": "http://74.48.78.17:16667",
"prodDisabled": true
},
"artifactPlan": {
"expectedArtifactCommit": "e6d4bd5",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"sourceCommitId": "e6d4bd5",
"serviceCommitIds": [
"e6d4bd5"
],
"matchesSourceCommit": true,
"published": true,
"registryVerified": true,
"imageCount": 13,
"requiredServiceCount": 13,
"disabledServiceCount": 0,
"unpublishedServices": []
},
"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": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5"
}
]
},
{
"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": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5"
}
]
},
{
"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": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5"
}
]
},
{
"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": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5"
}
]
},
{
"kind": "Deployment",
"name": "hwlab-gateway",
"namespace": "hwlab-dev",
"replicas": 0,
"serviceIds": [
"hwlab-gateway"
],
"containers": [
{
"name": "hwlab-gateway",
"serviceId": "hwlab-gateway",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5"
}
]
},
{
"kind": "StatefulSet",
"name": "hwlab-gateway-simu",
"namespace": "hwlab-dev",
"replicas": 2,
"serviceIds": [
"hwlab-gateway-simu"
],
"containers": [
{
"name": "hwlab-gateway-simu",
"serviceId": "hwlab-gateway-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5"
}
]
},
{
"kind": "StatefulSet",
"name": "hwlab-box-simu",
"namespace": "hwlab-dev",
"replicas": 2,
"serviceIds": [
"hwlab-box-simu"
],
"containers": [
{
"name": "hwlab-box-simu",
"serviceId": "hwlab-box-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5"
}
]
},
{
"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": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5"
}
]
},
{
"kind": "Deployment",
"name": "hwlab-router",
"namespace": "hwlab-dev",
"replicas": 1,
"serviceIds": [
"hwlab-router"
],
"containers": [
{
"name": "hwlab-router",
"serviceId": "hwlab-router",
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5"
}
]
},
{
"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": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5"
}
]
},
{
"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": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5"
}
]
},
{
"kind": "Job",
"name": "hwlab-cli-template",
"namespace": "hwlab-dev",
"replicas": 0,
"serviceIds": [
"hwlab-cli"
],
"containers": [
{
"name": "hwlab-cli",
"serviceId": "hwlab-cli",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5"
}
]
},
{
"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": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5"
}
]
}
],
"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-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",
"namespace": "hwlab-dev",
"serviceId": "hwlab-cloud-web",
"type": "ClusterIP",
"ports": [
{
"name": "http",
"port": 8080,
"targetPort": "http"
}
]
},
{
"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",
"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": 7430,
"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"
}
]
}
],
"templateJobReplacementPolicy": {
"status": "active",
"namespace": "hwlab-dev",
"scope": "DEV-only suspended template Jobs",
"allowedJobs": [
{
"name": "hwlab-agent-worker-template",
"serviceId": "hwlab-agent-worker",
"reason": "suspended session worker template Job has immutable spec.template"
},
{
"name": "hwlab-cli-template",
"serviceId": "hwlab-cli",
"reason": "suspended CLI template Job has immutable spec.template"
}
]
},
"templateJobReplacements": [
{
"namespace": "hwlab-dev",
"jobName": "hwlab-agent-worker-template",
"allowed": true,
"desiredSuspended": true,
"liveExists": true,
"liveSuspended": true,
"oldImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:b02ac5b",
"newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
"oldImages": [
{
"name": "hwlab-agent-worker",
"serviceId": "hwlab-agent-worker",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:b02ac5b"
}
],
"newImages": [
{
"name": "hwlab-agent-worker",
"serviceId": "hwlab-agent-worker",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5"
}
],
"replace": true,
"result": "replaced",
"reason": "Live suspended template Job was deleted and recreated by kubectl apply.",
"deleteCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml 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",
"jobName": "hwlab-cli-template",
"allowed": true,
"desiredSuspended": true,
"liveExists": true,
"liveSuspended": true,
"oldImage": "127.0.0.1:5000/hwlab/hwlab-cli:b02ac5b",
"newImage": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
"oldImages": [
{
"name": "hwlab-cli",
"serviceId": "hwlab-cli",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:b02ac5b"
}
],
"newImages": [
{
"name": "hwlab-cli",
"serviceId": "hwlab-cli",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5"
}
],
"replace": true,
"result": "replaced",
"reason": "Live suspended template Job was deleted and recreated by kubectl apply.",
"deleteCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml 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:e6d4bd5",
"oldImages": [],
"newImages": [
{
"name": "hwlab-gateway-simu",
"serviceId": "hwlab-gateway-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5"
}
],
"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:e6d4bd5",
"oldImages": [],
"newImages": [
{
"name": "hwlab-box-simu",
"serviceId": "hwlab-box-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5"
}
],
"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": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"imageTag": "e6d4bd5",
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
"repositoryDigest": null,
"publishState": "published",
"rolloutRevision": "41",
"liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"imageMatchesDesired": true,
"expectedRuntimeEnv": {
"HWLAB_COMMIT_ID": "e6d4bd5",
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"HWLAB_IMAGE_TAG": "e6d4bd5"
},
"liveRuntimeEnv": {
"status": "match",
"matchesDesired": true,
"fields": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "e6d4bd5",
"actual": "e6d4bd5",
"status": "match"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"status": "match"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "e6d4bd5",
"actual": "e6d4bd5",
"status": "match"
}
],
"drift": []
},
"runtimeEnvMatchesDesired": true,
"runtimeEnvDrift": [],
"verificationCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s",
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json",
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
"kubeconfigSource": "flag:--kubeconfig"
},
"cloudWebRolloutBeforeApply": {
"serviceId": "hwlab-cloud-web",
"namespace": "hwlab-dev",
"status": "observed",
"observationPhase": "before_apply",
"sourceCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"imageTag": "e6d4bd5",
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
"repositoryDigest": null,
"publishState": "published",
"rolloutRevision": "40",
"liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
"imageMatchesDesired": false,
"expectedRuntimeEnv": {
"HWLAB_COMMIT_ID": "e6d4bd5",
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"HWLAB_IMAGE_TAG": "e6d4bd5"
},
"liveRuntimeEnv": {
"status": "drift",
"matchesDesired": false,
"fields": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "e6d4bd5",
"actual": "b02ac5b",
"status": "drift"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
"status": "drift"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "e6d4bd5",
"actual": "b02ac5b",
"status": "drift"
}
],
"drift": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "e6d4bd5",
"actual": "b02ac5b",
"status": "drift"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
"status": "drift"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "e6d4bd5",
"actual": "b02ac5b",
"status": "drift"
}
]
},
"runtimeEnvMatchesDesired": false,
"runtimeEnvDrift": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "e6d4bd5",
"actual": "b02ac5b",
"status": "drift"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:b02ac5b",
"status": "drift"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "e6d4bd5",
"actual": "b02ac5b",
"status": "drift"
}
],
"verificationCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s",
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json",
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
"kubeconfigSource": "flag:--kubeconfig"
},
"cloudWebRolloutAfterApply": {
"serviceId": "hwlab-cloud-web",
"namespace": "hwlab-dev",
"status": "observed",
"observationPhase": "after_apply",
"sourceCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"imageTag": "e6d4bd5",
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
"repositoryDigest": null,
"publishState": "published",
"rolloutRevision": "41",
"liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"imageMatchesDesired": true,
"expectedRuntimeEnv": {
"HWLAB_COMMIT_ID": "e6d4bd5",
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"HWLAB_IMAGE_TAG": "e6d4bd5"
},
"liveRuntimeEnv": {
"status": "match",
"matchesDesired": true,
"fields": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "e6d4bd5",
"actual": "e6d4bd5",
"status": "match"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"status": "match"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "e6d4bd5",
"actual": "e6d4bd5",
"status": "match"
}
],
"drift": []
},
"runtimeEnvMatchesDesired": true,
"runtimeEnvDrift": [],
"verificationCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-web --timeout=180s",
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-web -o json",
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
"kubeconfigSource": "flag:--kubeconfig"
},
"codeAgentProvider": {
"desiredState": {
"contractVersion": "v1",
"environment": "dev",
"provider": "codex-stdio",
"runtimeProvider": "openai-responses",
"backend": "hwlab-cloud-api/codex-mcp-stdio",
"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": "blocked",
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json",
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
"expectedSecretRef": "hwlab-code-agent-provider/openai-api-key",
"expectedEgressTarget": "dev-egress-proxy",
"secretValuesRead": false,
"kubernetesSecretDataRead": false,
"valuesRedacted": true,
"contractVersion": "v1",
"environment": "dev",
"provider": "codex-stdio",
"runtimeProvider": "openai-responses",
"backend": "hwlab-cloud-api/codex-mcp-stdio",
"model": "gpt-5.5",
"ready": false,
"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": [
{
"name": "HWLAB_CODE_AGENT_PROVIDER",
"expected": "codex-stdio",
"redacted": false
}
],
"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=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployment hwlab-cloud-api -o json",
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
"expectedSecretRef": "hwlab-code-agent-provider/openai-api-key",
"expectedEgressTarget": "dev-egress-proxy",
"secretValuesRead": false,
"kubernetesSecretDataRead": false,
"valuesRedacted": true,
"contractVersion": "v1",
"environment": "dev",
"provider": "codex-stdio",
"runtimeProvider": "openai-responses",
"backend": "hwlab-cloud-api/codex-mcp-stdio",
"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": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml 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",
"beforeHumanApproval": [
"node scripts/dev-deploy-apply.mjs --dry-run --write-report",
"node scripts/validate-dev-gate-report.mjs"
],
"afterHumanApproval": [
"node scripts/dev-cd-apply.mjs --apply --confirm-dev --confirmed-non-production --write-report"
],
"summary": "Run the dry-run plan and validator immediately before requesting human approval; live apply still requires the explicit DEV confirmation flags."
},
"rollbackHint": {
"namespace": "hwlab-dev",
"strategy": "DEV-only Kubernetes rollback using deployment revision history; do not touch PROD or UniDesk services.",
"captureBeforeApply": [
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get pods,services,configmaps,deployments,jobs -o wide",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev get deployments -o json"
],
"deploymentRollbackCommands": [
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-api",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-cloud-web",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-mgr",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-gateway",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-patch-panel",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-router",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-tunnel-client",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-edge-proxy",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout undo deployment/hwlab-agent-skills"
],
"jobCleanupCommands": [
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-agent-worker-template --ignore-not-found",
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev delete job hwlab-cli-template --ignore-not-found"
],
"postRollbackChecks": [
"KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl -n hwlab-dev rollout status deployment/hwlab-cloud-api --timeout=120s",
"curl -fsS http://74.48.78.17:16667/health/live"
]
},
"remainingBlockers": [],
"artifactEvidence": [
{
"serviceId": "hwlab-cloud-api",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
"digest": "sha256:8a0677290ce3626d3589d1d22a943b49290e74451d75263cdbda3044a6ba105d",
"publishState": "published"
},
{
"serviceId": "hwlab-cloud-web",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"digest": "sha256:f43ac97da69212e3ff74cfed36a04d65f0cd9cc7b8cb48f0eaf6f1f19d7dd6da",
"publishState": "published"
},
{
"serviceId": "hwlab-agent-mgr",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
"digest": "sha256:f37e9b4dd6262ff4c30826fae1a0e01b184d0e57812c7876de73566263ff0c35",
"publishState": "published"
},
{
"serviceId": "hwlab-agent-worker",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
"digest": "sha256:afdc241c799fe53561b60a37199c73cfb612ea0381ecfba82e66eb08566a8336",
"publishState": "published"
},
{
"serviceId": "hwlab-gateway",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
"digest": "sha256:27303c093330bddf4c1eb8e3791dce6dbbe97aab28ff17c1faf761b05333cce0",
"publishState": "published"
},
{
"serviceId": "hwlab-gateway-simu",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
"digest": "sha256:38c0372ec72e8f17b26f2fcf83d35718023a81c48529e459d83e36f8cc56ec3a",
"publishState": "published"
},
{
"serviceId": "hwlab-box-simu",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
"digest": "sha256:d551c22242fff6016f15672c4b8b06dbfc85da2c00ecfdd4e40486668b58a56f",
"publishState": "published"
},
{
"serviceId": "hwlab-patch-panel",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
"digest": "sha256:6c7f3600a71131c11b994a625fd6ced65ac3bb7f109f3c7f941513cbd1d2def5",
"publishState": "published"
},
{
"serviceId": "hwlab-router",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
"digest": "sha256:8d9084f3d23e44d3ffe628e9d100ebbad260c857d06b1fbb5791ecd11bfc4d9f",
"publishState": "published"
},
{
"serviceId": "hwlab-tunnel-client",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
"digest": "sha256:d6dff1383912ccfed1b1b91dc5ae8323e345f42f57145d7bda788e9941a4ca5a",
"publishState": "published"
},
{
"serviceId": "hwlab-edge-proxy",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
"digest": "sha256:6ce280c0fd17218dd5719d1118b5e72fd0c4107dc33951e09b35c374f7affacd",
"publishState": "published"
},
{
"serviceId": "hwlab-cli",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
"digest": "sha256:09a015e727738cd188853af557ecd8ea4adfa8a2250692e7442549e9c80eae1f",
"publishState": "published"
},
{
"serviceId": "hwlab-agent-skills",
"deployCommitId": "e6d4bd5",
"catalogCommitId": "e6d4bd5",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
"digest": "sha256:45602b9d09ef22095ab75bd95e2f310626bce61bc4e39a7205009fe9620c2d4f",
"publishState": "published"
}
],
"cloudApiDb": {
"status": "contract-ready",
"requiredEnv": [
{
"name": "HWLAB_CLOUD_DB_URL",
"manifestPresent": true,
"k8sPresent": true,
"redacted": true,
"source": "k8s-secret-ref",
"secretRef": {
"secretName": "hwlab-cloud-api-dev-db",
"secretKey": "database-url",
"present": true,
"redacted": true
}
},
{
"name": "HWLAB_CLOUD_DB_SSL_MODE",
"manifestPresent": true,
"k8sPresent": true,
"redacted": false,
"source": "runtime-env",
"secretRef": null
}
],
"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,
"configReady": true,
"connected": false,
"liveConnected": false,
"connectionChecked": false,
"connectionAttempted": false,
"connectionResult": "unknown",
"liveDbEvidence": false,
"requiredEnv": [
{
"name": "HWLAB_CLOUD_DB_URL",
"present": true,
"redacted": true
},
{
"name": "HWLAB_CLOUD_DB_SSL_MODE",
"present": true,
"redacted": false
}
],
"missingEnv": [],
"secretRefs": [
{
"env": "HWLAB_CLOUD_DB_URL",
"secretName": "hwlab-cloud-api-dev-db",
"secretKey": "database-url",
"present": true,
"envInjected": true,
"secretPresent": "not_observed",
"secretKeyPresent": "not_observed",
"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,
"fixtureEvidence": false
},
"secretMaterialRead": false,
"valuesRedacted": true,
"liveDbEvidence": false,
"fixtureEvidence": false,
"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": 16,
"configMaps": 1
},
"images": [
{
"serviceId": "hwlab-cloud-api",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:e6d4bd5",
"kind": "Deployment",
"name": "hwlab-cloud-api"
},
{
"serviceId": "hwlab-cloud-web",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"kind": "Deployment",
"name": "hwlab-cloud-web"
},
{
"serviceId": "hwlab-agent-mgr",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:e6d4bd5",
"kind": "Deployment",
"name": "hwlab-agent-mgr"
},
{
"serviceId": "hwlab-agent-worker",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:e6d4bd5",
"kind": "Job",
"name": "hwlab-agent-worker-template"
},
{
"serviceId": "hwlab-gateway",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:e6d4bd5",
"kind": "Deployment",
"name": "hwlab-gateway"
},
{
"serviceId": "hwlab-gateway-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:e6d4bd5",
"kind": "StatefulSet",
"name": "hwlab-gateway-simu"
},
{
"serviceId": "hwlab-box-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:e6d4bd5",
"kind": "StatefulSet",
"name": "hwlab-box-simu"
},
{
"serviceId": "hwlab-patch-panel",
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:e6d4bd5",
"kind": "Deployment",
"name": "hwlab-patch-panel"
},
{
"serviceId": "hwlab-router",
"image": "127.0.0.1:5000/hwlab/hwlab-router:e6d4bd5",
"kind": "Deployment",
"name": "hwlab-router"
},
{
"serviceId": "hwlab-tunnel-client",
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:e6d4bd5",
"kind": "Deployment",
"name": "hwlab-tunnel-client"
},
{
"serviceId": "hwlab-edge-proxy",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:e6d4bd5",
"kind": "Deployment",
"name": "hwlab-edge-proxy"
},
{
"serviceId": "hwlab-cli",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:e6d4bd5",
"kind": "Job",
"name": "hwlab-cli-template"
},
{
"serviceId": "hwlab-agent-skills",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:e6d4bd5",
"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": "e6d4bd5",
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"HWLAB_IMAGE_TAG": "e6d4bd5"
},
"status": "match",
"matchesDesired": true,
"fields": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "e6d4bd5",
"actual": "e6d4bd5",
"status": "match"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:e6d4bd5",
"status": "match"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "e6d4bd5",
"actual": "e6d4bd5",
"status": "match"
}
],
"drift": []
}
]
},
"clusterObservation": {
"status": "pass",
"executor": "/usr/local/bin/kubectl",
"kubeconfig": "/etc/rancher/k3s/k3s.yaml",
"kubeconfigSource": "flag:--kubeconfig",
"commandPrefix": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl",
"readCommand": "KUBECONFIG=/etc/rancher/k3s/k3s.yaml 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-99d44c747-mfqzj",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-agent-skills-7f99b49598-lqjdd",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-box-simu-0",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-box-simu-1",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-cloud-api-57cfcfc587-kdvg9",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-cloud-web-67c684947b-lkvtj",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-edge-proxy-85db66bcc9-mv8pv",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-frpc-59f57d479c-tgjhl",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-gateway-simu-0",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-gateway-simu-1",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-patch-panel-7cd9d9d597-kwnm6",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-router-65dc5579fb-d2r8l",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-runtime-migrate-35e3d897-kfr4m",
"phase": "Succeeded"
},
{
"kind": "Pod",
"name": "hwlab-runtime-provision-35e3d897-jk2rc",
"phase": "Succeeded"
},
{
"kind": "Pod",
"name": "hwlab-tunnel-client-54d968477d-mf2qk",
"phase": "Running"
},
{
"kind": "Service",
"name": "hwlab-agent-mgr"
},
{
"kind": "Service",
"name": "hwlab-agent-skills"
},
{
"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"
},
{
"kind": "Service",
"name": "hwlab-cloud-api"
},
{
"kind": "Service",
"name": "hwlab-cloud-web"
},
{
"kind": "Service",
"name": "hwlab-edge-proxy"
},
{
"kind": "Service",
"name": "hwlab-gateway"
},
{
"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"
},
{
"kind": "Service",
"name": "hwlab-router"
},
{
"kind": "Service",
"name": "hwlab-tunnel-client"
},
{
"kind": "ConfigMap",
"name": "hwlab-dev-health-contract"
},
{
"kind": "ConfigMap",
"name": "hwlab-frpc-config"
},
{
"kind": "ConfigMap",
"name": "kube-root-ca.crt"
},
{
"kind": "Deployment",
"name": "hwlab-agent-mgr",
"readyReplicas": 1,
"replicas": 1
},
{
"kind": "Deployment",
"name": "hwlab-agent-skills",
"readyReplicas": 1,
"replicas": 1
},
{
"kind": "Deployment",
"name": "hwlab-cloud-api",
"readyReplicas": 1,
"replicas": 1
},
{
"kind": "Deployment",
"name": "hwlab-cloud-web",
"readyReplicas": 1,
"replicas": 1
},
{
"kind": "Deployment",
"name": "hwlab-edge-proxy",
"readyReplicas": 1,
"replicas": 1
},
{
"kind": "Deployment",
"name": "hwlab-frpc",
"readyReplicas": 1,
"replicas": 1
},
{
"kind": "Deployment",
"name": "hwlab-gateway"
},
{
"kind": "Deployment",
"name": "hwlab-patch-panel",
"readyReplicas": 1,
"replicas": 1
},
{
"kind": "Deployment",
"name": "hwlab-router",
"readyReplicas": 1,
"replicas": 1
},
{
"kind": "Deployment",
"name": "hwlab-tunnel-client",
"readyReplicas": 1,
"replicas": 1
},
{
"kind": "Job",
"name": "hwlab-agent-worker-template"
},
{
"kind": "Job",
"name": "hwlab-cli-template"
},
{
"kind": "Job",
"name": "hwlab-runtime-migrate-35e3d897"
},
{
"kind": "Job",
"name": "hwlab-runtime-provision-35e3d897"
}
]
},
"liveProbe": {
"status": "pass",
"url": "http://74.48.78.17:16667/health/live",
"httpStatus": 200,
"body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"degraded\",\"ready\":false,\"revision\":\"b02ac5becad13aeeab0d5cb7d8f01300bccb78c2\",\"readiness\":{\"contractVersion\":\"v3\",\"ready\":false,\"status\":\"degraded\",\"blockerCodes\":[\"stdio_protocol_not_wired\"],\"blockers\":[{\"code\":\"stdio_protocol_not_wired\",\"type\":\"agent_blocker\",\"scope\":\"code-agent-long-lived-session\",\"status\":\"open\",\"sourceIssue\":\"pikasTech/HWLAB#275\",\"summary\":\"普通聊天可走 OpenAI Responses fallbackpwd/skills 走受控只读 runnerM3 IO 走 Skill CLI"
}
},
"blockers": [],
"notes": "DEV-only result. No PROD resources, secret values, force push, heavy e2e, browser e2e, or UniDesk runtime substitute were used."
}