Skip to content

docs: Document pod runtime status and specific SSH not-ready reasons in the runpodctl reference - #758

Merged
lavanya-gunreddi merged 6 commits into
mainfrom
promptless/runpodctl-pod-runtime-status
Oct 16, 2026
Merged

lavanya-gunreddi merged 6 commits into
mainfrom
promptless/runpodctl-pod-runtime-status

Conversation

@promptless

@promptless promptless Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

Open in Promptless

runpodctl pod get and runpodctl pod list now report a derived runtimeStatus (plus a runtimeStatusReason token when there is more to say) alongside desiredStatus, so users can tell a Pod that is still pulling its image apart from one that is actually running. runpodctl ssh info now names the specific reason a Pod is unreachable instead of a generic "pod not ready" message.

This adds a "Pod runtime status" section to the runpodctl pod reference documenting the six runtimeStatus values and the reason tokens, a worked JSON example, and guidance on polling to readiness. It updates the ssh reference with a table of the specific not-ready causes and their remedies — including a warning that runpodctl pod update --ports replaces the entire port list and can restart the container — and adds a discoverability cross-link from the Pods SSH troubleshooting guide. The pod list --status flag description now clarifies that it filters desiredStatus (RUNNING/EXITED, matched case-insensitively) and does not accept runtimeStatus values like initializing, which return no results — a distinction that matters now that the same page teaches the runtimeStatus vocabulary.

Files touched:

  • runpodctl/reference/runpodctl-pod.mdx
  • runpodctl/reference/runpodctl-ssh.mdx
  • pods/configuration/use-ssh.mdx

Revision for runpodctl PR #366 (REST v2 migration): runpodctl no longer reports lastStatusChange or the stopped_by_* / terminated_* / *_outbid reason tokens, because REST v2 doesn't return the status-change text they were derived from. This revision removes them, adds the new error runtime status (desiredStatus ERROR, which won't recover on its own and still bills) to the pod and ssh tables, updates stopped/terminated to map directly from EXITED/TERMINATED, and replaces the note about desiredStatus and runtimeStatus disagreeing, since both now come from one read. The branch is also merged up to current main.

Sources: runpodctl PR #315 (Linear CON-690); runpodctl PR #366.

Revision for reviewer feedback: Both requested style fixes are applied verbatim. (1) In runpodctl-pod.mdx, the em dashes in the terminated row of the runtime status table are now parentheses. (2) In runpodctl-ssh.mdx, "now" is removed from the ssh info Note, which now reads "...reports the specific reason instead of a generic message." No other edits were made.

Trigger Events


Tip: Use labels in the Promptless dashboard to categorize suggestions by release or team 🏷️

Add a Pod runtime status section to the runpodctl pod reference covering
the new runtimeStatus/runtimeStatusReason/lastStatusChange fields on
pod get and pod list, update the ssh reference with the specific
not-ready causes and the --ports remedy warning, and cross-link from the
SSH troubleshooting guide (runpodctl PR #315, CON-690).
Comment thread runpodctl/reference/runpodctl-pod.mdx Outdated

## Pod runtime status

`runpodctl pod get` and `runpodctl pod list` now report a Pod's real runtime state in their JSON and YAML output, alongside the existing `desiredStatus`. `desiredStatus` is the state you asked for (for example, `RUNNING`), while `runtimeStatus` is what the Pod is actually doing. For example, a Pod still pulling a large image and a Pod that has been serving traffic for an hour both show `desiredStatus: RUNNING`, but their `runtimeStatus` values differ.

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-pod.mdx:279

desiredStatus vs runtimeStatus distinction (desiredStatus is what was requested, runtimeStatus is derived/actual) is documented verbatim in the podstate package comment, from open PR runpod/runpodctl#315 (CON-690, not yet merged).

Source: podstate.go:1–27 · ea017f6


`runpodctl pod get` and `runpodctl pod list` now report a Pod's real runtime state in their JSON and YAML output, alongside the existing `desiredStatus`. `desiredStatus` is the state you asked for (for example, `RUNNING`), while `runtimeStatus` is what the Pod is actually doing. For example, a Pod still pulling a large image and a Pod that has been serving traffic for an hour both show `desiredStatus: RUNNING`, but their `runtimeStatus` values differ.

<ResponseField name="runtimeStatus" type="string">

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-pod.mdx:281

Citation withdrawn.

podListOutput struct confirms runtimeStatus has no omitempty (always present); runtimeStatusReason and lastStatusChange both have omitempty. Same shape appears on pod get (cmd/pod/get.go response struct). From open PR runpodctl#315.

Source: list.go:34–53 · ea017f6

@mintlify

mintlify Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
runpod-docs 🟢 Ready View Preview Oct 16, 2026, 6:32 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

Present when available. The backend's raw status text (for example, `Exited by user: <date>` or `Outbid: <date>`).
</ResponseField>

For example, `runpodctl pod list --output json` returns entries like this for a running Pod:

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-pod.mdx:293

JSON example field names (id, name, desiredStatus, runtimeStatus, imageName, gpuCount, costPerHr, createdAt, uptimeSeconds) all match real podListOutput fields populated in runList; no fabricated field names. --output flag consumed via cmd.Flag("output") (persistent flag, StringVarP "output"/"o", default "json"), so --output json is a valid invocation form.

Source: list.go:182–200 · ea017f6


### Runtime status values

| Value | Meaning | What to do |

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-pod.mdx:313

Citation withdrawn.

Runtime status values table (running/initializing/stopped/terminated/unknown) matches the Status constants and doc comments exactly, including "does not imply a port is reachable" and the terminated pod's narrow drop-out-of-list window (getMyPods filters terminatedAt: null, see lines 77-81 of same file).

Source: podstate.go:90–120 · ea017f6


### Runtime status reasons

| Token | Paired status | Meaning |

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-pod.mdx:323

Citation withdrawn.

Runtime status reasons table matches the eight Reason constants and their doc comments verbatim (awaiting_container, stopped/terminated_by_user, stopped/terminated_by_runpod, stopped/terminated_outbid, runtime_unavailable).

Source: podstate.go:127–165 · ea017f6

Comment thread runpodctl/reference/runpodctl-pod.mdx Outdated
</Tip>

<Note>
`runtimeStatus` and `desiredStatus` come from different sources, so a single command can briefly show them disagreeing (for example, `desiredStatus: RUNNING` next to `runtimeStatus: stopped`). When they disagree, trust `runtimeStatus`.

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-pod.mdx:345

Citation withdrawn.

Confirms runtimeStatus is derived from the GraphQL snapshot while desiredStatus is REST's, and that the two surfaces can momentarily disagree (matches PR README language "when they disagree, trust runtimeStatus").

Source: list.go:153–180 · ea017f6

Comment thread runpodctl/reference/runpodctl-pod.mdx Outdated
`runtimeStatus` and `desiredStatus` come from different sources, so a single command can briefly show them disagreeing (for example, `desiredStatus: RUNNING` next to `runtimeStatus: stopped`). When they disagree, trust `runtimeStatus`.
</Note>

The `uptimeSeconds` field now reports the container's actual uptime and is omitted entirely when no container is reporting, instead of always showing `0`.

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-pod.mdx:348

uptimeSeconds is set only when runtimeStatus is running and runtime telemetry exists; otherwise left nil, which the omitempty tag drops from output instead of always reporting 0.

Source: list.go:176–180 · ea017f6

`runpodctl ssh info` explains which of the following cases applies. It also reports the Pod's `runtimeStatus`, so you can match a not-ready result to the runtime status vocabulary:

| Reason | Meaning | What to do |
| --- | --- | --- |

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-ssh.mdx:44

Not-ready reasons table (initializing/stopped/terminated via state.Explain; no port 22 published, no public IP, mapping not ready via sshPortDetail) matches NotReadyMessage/sshPortDetail exactly, including the three distinct running-pod SSH-unreachable causes.

Source: notready.go:10–50 · ea017f6

| No public IP | Port 22 is mapped, but the machine has no publicly routable IP. This affects direct SSH over a public IP specifically; basic SSH (proxied through Runpod, no public IP required) may still work. | Use [Basic SSH](/pods/configuration/use-ssh#basic-ssh-with-key-authentication), which does not need a public IP. If you need direct SSH over a public IP, redeploy on a machine that provides one. |
| Mapping not ready yet | Port 22 is declared, but the host has not published the mapping yet. | Wait and try again. |

For the "No SSH port published" case, `runpodctl ssh info` gives you a ready-to-run command of the form `runpodctl pod update <pod-id> --ports <existing-ports>,22/tcp` that preserves your existing ports.

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-ssh.mdx:52

Confirms the exact remedy command form runpodctl pod update <pod-id> --ports <existing-ports>,22/tcp built by addSSHPortCommand, preserving existing declared ports before appending 22/tcp.

Source: notready.go:52–82 · ea017f6


For the "No SSH port published" case, `runpodctl ssh info` gives you a ready-to-run command of the form `runpodctl pod update <pod-id> --ports <existing-ports>,22/tcp` that preserves your existing ports.

<Warning>

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-ssh.mdx:54

Confirms --ports is wholesale replacement (not additive like --env), sourced from cmd/pod/update.go setting req.Ports to exactly what was passed; changing ports bumps pod version (editJob increments version), which can trigger a container recreate/restart.

Source: notready.go:52–68 · ea017f6


</Note>

`runpodctl ssh info` explains which of the following cases applies. It also reports the Pod's `runtimeStatus`, so you can match a not-ready result to the runtime status vocabulary:

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

runpodctl/reference/runpodctl-ssh.mdx:41

Confirms runSSHInfoWithArgs includes a "runtimeStatus" key in the not-ready JSON/YAML output map alongside the error/id/name/status fields.

Source: ssh.go:191–211 · ea017f6

@promptless promptless Bot Aug 5, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Citation

pods/configuration/use-ssh.mdx:77

Confirms Basic SSH is described elsewhere in this same file as proxied through Runpod's systems, supporting the runpodctl-ssh.mdx claim that basic SSH does not require a public IP.

Source: use-ssh.mdx:77 · eeff71f

@promptless
promptless Bot marked this pull request as ready for review August 5, 2026 18:52
The --status flag matches desiredStatus (RUNNING/EXITED) case-insensitively
and does not accept runtimeStatus values like initializing, which now appear
on the same page. Reflects the merged --status help-text clarification from
runpodctl PR #315 (CON-690).
Comment thread runpodctl/reference/runpodctl-pod.mdx
Comment thread runpodctl/reference/runpodctl-pod.mdx
Comment thread runpodctl/reference/runpodctl-pod.mdx
Comment thread runpodctl/reference/runpodctl-pod.mdx
Comment thread runpodctl/reference/runpodctl-pod.mdx
Comment thread runpodctl/reference/runpodctl-pod.mdx
Comment thread runpodctl/reference/runpodctl-ssh.mdx
@lavanya-gunreddi

Copy link
Copy Markdown
Contributor

@Promptless apply these two style fixes only:

Fix 1 — Em dashes in runpodctl/reference/runpodctl-pod.mdx

In the terminated row of the “Runtime status values” table, replace the em dashes with parentheses:

Current:

a teardown script should treat “Pod not found”—not runtimeStatus: terminated—as the reliable signal that a Pod is gone.

Fixed:

a teardown script should treat “Pod not found” (not runtimeStatus: terminated) as the reliable signal that a Pod is gone.

Fix 2 — “now” in runpodctl/reference/runpodctl-ssh.mdx

In the Note under the ssh info command, remove the word “now” — docs describe current state, not changes from a previous version:

Current:

When a Pod is not reachable, runpodctl ssh info now reports the specific reason instead of a generic “pod not ready” message.

Fixed:

When a Pod is not reachable, runpodctl ssh info reports the specific reason instead of a generic message.

@promptless

promptless Bot commented Oct 16, 2026

Copy link
Copy Markdown
Contributor Author

In reply to this discussion

I'm applying your two style fixes: parentheses in place of the em dashes in runpodctl-pod.mdx, and removing "now" from the Note in runpodctl-ssh.mdx. I won't make any other edits, and I'll reply here when the branch is updated.

@promptless

promptless Bot commented Oct 16, 2026

Copy link
Copy Markdown
Contributor Author

In reply to this discussion

Both style fixes are on the branch. The terminated row in runpodctl-pod.mdx uses parentheses instead of em dashes, and the ssh info Note in runpodctl-ssh.mdx drops "now" and ends with "instead of a generic message." Nothing else changed.

@lavanya-gunreddi
lavanya-gunreddi merged commit 40c33af into main Oct 16, 2026
2 checks passed
@lavanya-gunreddi
lavanya-gunreddi deleted the promptless/runpodctl-pod-runtime-status branch October 16, 2026 19:40

This branch was successfully deployed

1 active deployment
staging — 92cb185d Deployed Oct 16, 2026 by mintlify[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant