{
 "ticket": "U66 #103",
 "generatedAt": "2026-10-28T23:47:52.269025+08:00",
 "startedAt": "2026-10-28T23:47:49.662145+08:00",
 "purpose": "Kubernetes 清单契约（真实 kubectl kustomize 渲染）+ 滚动发布/探针预算/停机时序的状态机推演",
 "exitCode": 0,
 "testCount": 10,
 "reports": [
  {
   "name": "study.k8s.ManifestContractTest",
   "tests": "10",
   "failures": "0",
   "errors": "0",
   "skipped": "0",
   "time": "0.252"
  }
 ],
 "results": [
  {
   "name": "clean-test",
   "command": [
    "/Users/gaochao/develop/maven-3.9.9/bin/mvn",
    "-B",
    "-q",
    "clean",
    "test"
   ],
   "exitCode": 0,
   "observed": [
    "U66 gracefulDrain=PASS grace=30s preStop=5s drainBudget=25s",
    "U66 overlayRender=PASS prefix=prod- replicas=6 requests=500m/512Mi limits=2/1Gi",
    "U66 kustomizeRender=PASS kubectl=v1.33.9 baseObjects=7",
    "U66 probeBudget=PASS startup=60s readiness=15s liveness=30s",
    "U66 objects=PASS service=ClusterIP pdb=minAvailable2 pvcTemplate=data headless=None serviceName=ledger-store-headless",
    "U66 secretHygiene=PASS placeholder=true",
    "U66 rolloutTradeoff=PASS zeroSurgeMax=3 noDowntimeMax=4 noDowntimeMin=3",
    "U66 rolloutLatency=PASS fastSteps=5 slowSteps=9 floor=2",
    "U66 rolloutModel=PASS minAvailable=2 maxTotal=4",
    "U66 qosClass=PASS class=Burstable"
   ]
  }
 ],
 "observations": [
  "U66 gracefulDrain",
  "U66 kustomizeRender",
  "U66 objects",
  "U66 overlayRender",
  "U66 probeBudget",
  "U66 qosClass",
  "U66 rolloutLatency",
  "U66 rolloutModel",
  "U66 rolloutTradeoff",
  "U66 secretHygiene"
 ],
 "environment": {
  "os": "macOS-27.2-arm64-arm-64bit",
  "arch": "arm64",
  "javaVersion": "openjdk version \"21.0.11\" 2026-04-21 LTS",
  "maven": "Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)",
  "kubectl": "Client Version: v1.33.9",
  "snakeyaml": "2.5（Boot 4.0.9 BOM 管理）",
  "sourceTag": "kubernetes/kubernetes v1.33.9（与本机 kubectl 同线）"
 },
 "files": {
  "README.md": "17de77f811da362ff3c6f27b00780f016202b52c37044f35d3cd08093714866f",
  "pom.xml": "332c98bbbab3abfc99c448d7728c2fc017f59836154ae566cb8ad140c73b6744",
  "run.py": "b49a17a02e5210b5330e9f2ae41422ac8b0e7a148d7bc1f2c39be4d877e6daad",
  "src/main/java/study/k8s/Manifests.java": "3953b0ef14bb4daeae929236bd827ac165fb772934e27124454ff38c1f02ad50",
  "src/main/java/study/k8s/RolloutModel.java": "9aec1030b397fdc3e1fa26cb7e6c4d28e9bfc34ff376622a2bd84d72cacf4226",
  "src/main/resources/manifests/base/configmap.yaml": "1bcf6a2ffcde927663e013bfa156782d7683e8d27137687bd9baa8b3da13d03c",
  "src/main/resources/manifests/base/deployment.yaml": "1733af7653f2538f687cc99c0c4bba287f0bdfb0d34ac49882cfd8c7af94f153",
  "src/main/resources/manifests/base/kustomization.yaml": "0b5508db82bf633b7bc9353963ff5fa8b9f4e25f90283d57729451591a5360b4",
  "src/main/resources/manifests/base/pdb.yaml": "30029388d3a7405c8fb5b536f3ee220ab599dc0bfcf999667e95e7ab7f8d336f",
  "src/main/resources/manifests/base/service.yaml": "0c2f599d9effd21ddc8b75d97bee5ed7bd28b942b6c68e0cb6dddf3b31f454f1",
  "src/main/resources/manifests/base/statefulset.yaml": "2ba396ca094ac636f5ff65b151939673e5b48d9ef61eb1dd3392748dd7b2c3c5",
  "src/main/resources/manifests/overlays/prod/kustomization.yaml": "f31cb024bca9abaea2fbd50938c0087029b66dfe904cf495a5d243d06f70e1f6",
  "src/main/resources/manifests/overlays/prod/resources-patch.yaml": "63ca7e95761566b5af40de24f5e18efd78d8cdc7ec7a15ec336dadd8af2e6440",
  "src/test/java/study/k8s/ManifestContractTest.java": "55356c1080a389d9a8ffb77acdb994c8db3907809273f0fce8a767d54303e705"
 },
 "cluster": {
  "kubeconfigPresent": false,
  "dockerBinaryPresent": true,
  "dockerDaemonReachable": false,
  "kindInstalled": false,
  "minikubeInstalled": false,
  "k3dInstalled": false,
  "api6443Listening": false
 },
 "blocked": [
  {
   "kind": "真实集群 apply/rollout/探针/驱逐/PVC 绑定",
   "status": "受阻",
   "environment": "本机无 Kubernetes 集群: kubeconfigPresent=False, dockerBinaryPresent=True, api6443Listening=False",
   "reason": "票面允许\"本机无集群时受阻仍算待验证\"；kind/minikube 未安装，不自行安装或购买集群",
   "limits": "滚动/探针/驱逐的时间数字均为状态机推演与配置算术，不是集群观察"
  }
 ],
 "limits": [
  "kubectl kustomize 渲染与 SnakeYAML 解析真实执行；API server 接受性、调度放置、探针真实判定、驱逐顺序、PVC 实际绑定均未运行（无集群）。",
  "滚动发布的 minAvailable/maxTotal 是控制器约束的推演，不是集群压测或容量评估。",
  "探针预算（periodSeconds × failureThreshold）是配置算术；真实探测失败/恢复时序未观察。",
  "U24 的 Actuator 探针时间线在 Linux 上实跑过（readiness 503→200），本票只引用不重跑。"
 ]
}
