Files
pikasTech-HWLAB/reports/dev-gate/dev-deploy-report.json
T
2026-05-24 00:31:01 +00:00

1800 lines
57 KiB
JSON

{
"$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": "48dfbf9",
"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-24T00:18:29.328Z",
"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: 48dfbf9",
"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: pass",
"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": "48dfbf9",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"sourceCommitId": "48dfbf9",
"serviceCommitIds": [
"48dfbf9"
],
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
},
{
"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:48dfbf9"
}
]
}
],
"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:3df89fe",
"newImage": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9",
"oldImages": [
{
"name": "hwlab-agent-worker",
"serviceId": "hwlab-agent-worker",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:3df89fe"
}
],
"newImages": [
{
"name": "hwlab-agent-worker",
"serviceId": "hwlab-agent-worker",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9"
}
],
"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:3df89fe",
"newImage": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9",
"oldImages": [
{
"name": "hwlab-cli",
"serviceId": "hwlab-cli",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:3df89fe"
}
],
"newImages": [
{
"name": "hwlab-cli",
"serviceId": "hwlab-cli",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9"
}
],
"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:48dfbf9",
"oldImages": [],
"newImages": [
{
"name": "hwlab-gateway-simu",
"serviceId": "hwlab-gateway-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9"
}
],
"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:48dfbf9",
"oldImages": [],
"newImages": [
{
"name": "hwlab-box-simu",
"serviceId": "hwlab-box-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9"
}
],
"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": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"imageTag": "48dfbf9",
"digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f",
"repositoryDigest": null,
"publishState": "published",
"rolloutRevision": "44",
"liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"imageMatchesDesired": true,
"expectedRuntimeEnv": {
"HWLAB_COMMIT_ID": "48dfbf9",
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"HWLAB_IMAGE_TAG": "48dfbf9"
},
"liveRuntimeEnv": {
"status": "match",
"matchesDesired": true,
"fields": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "48dfbf9",
"actual": "48dfbf9",
"status": "match"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"status": "match"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "48dfbf9",
"actual": "48dfbf9",
"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": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"imageTag": "48dfbf9",
"digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f",
"repositoryDigest": null,
"publishState": "published",
"rolloutRevision": "43",
"liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe",
"imageMatchesDesired": false,
"expectedRuntimeEnv": {
"HWLAB_COMMIT_ID": "48dfbf9",
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"HWLAB_IMAGE_TAG": "48dfbf9"
},
"liveRuntimeEnv": {
"status": "drift",
"matchesDesired": false,
"fields": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "48dfbf9",
"actual": "3df89fe",
"status": "drift"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe",
"status": "drift"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "48dfbf9",
"actual": "3df89fe",
"status": "drift"
}
],
"drift": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "48dfbf9",
"actual": "3df89fe",
"status": "drift"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe",
"status": "drift"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "48dfbf9",
"actual": "3df89fe",
"status": "drift"
}
]
},
"runtimeEnvMatchesDesired": false,
"runtimeEnvDrift": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "48dfbf9",
"actual": "3df89fe",
"status": "drift"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:3df89fe",
"status": "drift"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "48dfbf9",
"actual": "3df89fe",
"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": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"imageTag": "48dfbf9",
"digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f",
"repositoryDigest": null,
"publishState": "published",
"rolloutRevision": "44",
"liveImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"imageMatchesDesired": true,
"expectedRuntimeEnv": {
"HWLAB_COMMIT_ID": "48dfbf9",
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"HWLAB_IMAGE_TAG": "48dfbf9"
},
"liveRuntimeEnv": {
"status": "match",
"matchesDesired": true,
"fields": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "48dfbf9",
"actual": "48dfbf9",
"status": "match"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"status": "match"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "48dfbf9",
"actual": "48dfbf9",
"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": "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"
},
"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": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:48dfbf9",
"digest": "sha256:15a9dec43d0ad6b750ea4eda860c1c157c6502441732c1de20ef3b92696d0dfc",
"publishState": "published"
},
{
"serviceId": "hwlab-cloud-web",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"digest": "sha256:fc1841a6e3e8d427d23b5a0187abbe9d73208e3ad2c638e31b9512aaf075699f",
"publishState": "published"
},
{
"serviceId": "hwlab-agent-mgr",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9",
"digest": "sha256:bdb3dffd0a82e7cf1c48de3d130cbd6e733c242dd5667be4ba098a46888a13d6",
"publishState": "published"
},
{
"serviceId": "hwlab-agent-worker",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9",
"digest": "sha256:902590cd05c9af8dcf347b74c05e1fb9fb399eefa54d91ff105dd2fa276ae785",
"publishState": "published"
},
{
"serviceId": "hwlab-gateway",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9",
"digest": "sha256:015916d05ccbd8448e3f32d754335f7c221aaaadf5ae2b63007d7698f7583d04",
"publishState": "published"
},
{
"serviceId": "hwlab-gateway-simu",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9",
"digest": "sha256:74793df73dfeb27fc45b1085ac1c29839f6545ccfea79d033dfddc89d6f3a553",
"publishState": "published"
},
{
"serviceId": "hwlab-box-simu",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9",
"digest": "sha256:89d80def71130db7e0f4d9a0ec1dadfcb5d8963bd1f13b71c67eab0a301efb94",
"publishState": "published"
},
{
"serviceId": "hwlab-patch-panel",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9",
"digest": "sha256:160a47204b2263e750cbf412f0d266047eeb6baf8b2be839e5d1987fc6082fea",
"publishState": "published"
},
{
"serviceId": "hwlab-router",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9",
"digest": "sha256:0ab02340575ec7e910427f8ea06db2b8f8095922e207ae5e11a64c065fa26df7",
"publishState": "published"
},
{
"serviceId": "hwlab-tunnel-client",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9",
"digest": "sha256:75af6caa96ec03d3f4130e512052f666d75b1e5470fa67f8f66f355e1068e43f",
"publishState": "published"
},
{
"serviceId": "hwlab-edge-proxy",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9",
"digest": "sha256:f8b954ad76ab0162e3df0edc26c115f6c697f8f5c4e9d93e24112285b57b9b05",
"publishState": "published"
},
{
"serviceId": "hwlab-cli",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9",
"digest": "sha256:ae6564b6b0f8ceaf35ab5d2e7f7c04ca8f5e51aa7daedb01e4a6aa31e4bcc16b",
"publishState": "published"
},
{
"serviceId": "hwlab-agent-skills",
"deployCommitId": "48dfbf9",
"catalogCommitId": "48dfbf9",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9",
"digest": "sha256:6fc9b4fda9bea32607774a24d72ecc7999007d910d17e11764abce2bdc35c03d",
"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:48dfbf9",
"kind": "Deployment",
"name": "hwlab-cloud-api"
},
{
"serviceId": "hwlab-cloud-web",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"kind": "Deployment",
"name": "hwlab-cloud-web"
},
{
"serviceId": "hwlab-agent-mgr",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-mgr:48dfbf9",
"kind": "Deployment",
"name": "hwlab-agent-mgr"
},
{
"serviceId": "hwlab-agent-worker",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-worker:48dfbf9",
"kind": "Job",
"name": "hwlab-agent-worker-template"
},
{
"serviceId": "hwlab-gateway",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:48dfbf9",
"kind": "Deployment",
"name": "hwlab-gateway"
},
{
"serviceId": "hwlab-gateway-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-simu:48dfbf9",
"kind": "StatefulSet",
"name": "hwlab-gateway-simu"
},
{
"serviceId": "hwlab-box-simu",
"image": "127.0.0.1:5000/hwlab/hwlab-box-simu:48dfbf9",
"kind": "StatefulSet",
"name": "hwlab-box-simu"
},
{
"serviceId": "hwlab-patch-panel",
"image": "127.0.0.1:5000/hwlab/hwlab-patch-panel:48dfbf9",
"kind": "Deployment",
"name": "hwlab-patch-panel"
},
{
"serviceId": "hwlab-router",
"image": "127.0.0.1:5000/hwlab/hwlab-router:48dfbf9",
"kind": "Deployment",
"name": "hwlab-router"
},
{
"serviceId": "hwlab-tunnel-client",
"image": "127.0.0.1:5000/hwlab/hwlab-tunnel-client:48dfbf9",
"kind": "Deployment",
"name": "hwlab-tunnel-client"
},
{
"serviceId": "hwlab-edge-proxy",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:48dfbf9",
"kind": "Deployment",
"name": "hwlab-edge-proxy"
},
{
"serviceId": "hwlab-cli",
"image": "127.0.0.1:5000/hwlab/hwlab-cli:48dfbf9",
"kind": "Job",
"name": "hwlab-cli-template"
},
{
"serviceId": "hwlab-agent-skills",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:48dfbf9",
"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": "48dfbf9",
"HWLAB_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"HWLAB_IMAGE_TAG": "48dfbf9"
},
"status": "match",
"matchesDesired": true,
"fields": [
{
"name": "HWLAB_COMMIT_ID",
"expected": "48dfbf9",
"actual": "48dfbf9",
"status": "match"
},
{
"name": "HWLAB_IMAGE",
"expected": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"actual": "127.0.0.1:5000/hwlab/hwlab-cloud-web:48dfbf9",
"status": "match"
},
{
"name": "HWLAB_IMAGE_TAG",
"expected": "48dfbf9",
"actual": "48dfbf9",
"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-6f4cc98885-6bl9w",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-agent-skills-69485c4dc4-mpgdb",
"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-54cdcb57dc-xw9gb",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-cloud-web-5bd7bf9c6-d67jc",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-edge-proxy-58984dcc7c-8bvqj",
"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-55b9c584d7-7rzqb",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-router-76fd584bdb-t26cs",
"phase": "Running"
},
{
"kind": "Pod",
"name": "hwlab-runtime-migrate-5332b2f8-mlg9p",
"phase": "Succeeded"
},
{
"kind": "Pod",
"name": "hwlab-runtime-provision-5332b2f8-qdpq7",
"phase": "Succeeded"
},
{
"kind": "Pod",
"name": "hwlab-tunnel-client-69d7d6d6d8-pv8b9",
"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-5332b2f8"
},
{
"kind": "Job",
"name": "hwlab-runtime-provision-5332b2f8"
}
]
},
"liveProbe": {
"status": "pass",
"url": "http://74.48.78.17:16667/health/live",
"httpStatus": 200,
"body": "{\"serviceId\":\"hwlab-cloud-api\",\"environment\":\"dev\",\"status\":\"ok\",\"ready\":true,\"revision\":\"3df89fe15100f3ef3c2e12e1a001b5370d54eff9\",\"readiness\":{\"contractVersion\":\"v3\",\"ready\":true,\"status\":\"ok\",\"blockerCodes\":[],\"blockers\":[],\"components\":{\"db\":\"ready\",\"codeAgent\":\"ready\",\"runtime\":\"ready\",\"provider\":\"ready\",\"dbDurable\":\"ready\",\"sessionRunner\":\"codex_stdio_ready\",\"codexStdio\":\"ready\"},\"provider\":{\"status\":\"ready\",\"ready\":true,\"configured\":true,\"provider\":\"codex-stdio\",\"model\":\"gpt-5.5\",\"backend"
}
},
"blockers": [],
"notes": "DEV-only result. No PROD resources, secret values, force push, heavy e2e, browser e2e, or UniDesk runtime substitute were used."
}