--- id: RAIL-BS-WP-0014 type: workplan title: "Keep node remaining CPU honest for State Hub surge and pending demand" domain: financials repo: railiance-cluster status: finished owner: codex topic_slug: railiance origin: residual origin_ref: STATE-WP-0091 created: "2026-09-14" updated: "2026-09-14" related: [RCLUSTER-WP-0014, STATE-WP-0091, CUST-WP-0071] state_hub_workstream_id: "d89863aa-dc89-5a9d-be00-4f558a16d70b" --- Residual from STATE-WP-0091. State Hub now refuses promotion when remaining CPU cannot cover its 100m API surge, and when unrelated pending pods would eat the 5m sliver above 105m. Cluster observation must keep publishing allocatable, allocated, **and pending-unrelated** demand. 105m remaining is not capacity admission for factory or other zero-request workloads. ## Include pending pods in capacity observations ```task id: RAIL-BS-WP-0014-T01 status: done priority: high state_hub_task_id: "d90c384e-8a99-550f-b8b8-6314c073f2dc" ``` Extend `tools/observe_cluster_resources.py` / `make cluster-observe` so the published observation names pending unscheduled pods and their requests. State Hub's preflight already consumes that shape. Do not treat residual millicores as a scheduling guarantee. **Done 2026-09-14.** `build_observation` names pending unscheduled pods, uses effective pod requests (init vs containers), and emits `state_hub_preflight_observation` in the STATE-WP-0091 fixture shape. Residual CPU counts scheduled pods only. `not_a_scheduling_guarantee` is explicit. Unit test covers a 50m pending pod that does not inflate remaining.