Down to the Kubernetes manifest
From a project to the actual objects, their YAML, their events and their logs.
The rule this console tries to keep: you can always get to the real Kubernetes objects eventually. Here is every route down, and what to do when one is not available.
- 1
Start at a cell
On the project view or the environment view, every cell is a component or a resource in one environment. Clicking it takes you to that deployment's binding detail page.
- 2
The objects the platform created
The binding detail page lists what the
ReleaseBindingactually produced — Deployment, Service, HTTPRoute, ConfigMap, ExternalSecret, NetworkPolicy — with each object's health.This comes from the platform API's
k8sresourcesendpoints. The response is flat despite the endpoint being calledtree, so a Pod sits beside its Deployment rather than under it. - 3
Describe one object
Each object can be described down to its YAML. Not
kubectl describe's prose — that format is assembled by a printer inside kubectl and is not available over the API — but the object itself, which is the thingdescribeis a rendering of.Noise Kubernetes writes into everything is stripped first:
managedFields,resourceVersion,uid,generation.managedFieldsalone is routinely longer than the spec.GET
/api-docs#/default/api_deploy_describe_api_deploys__binding__describe_getrun it →The JSON twin, if you want the object without the page around it.
- 4
Events and pod output
The same page reaches the events the cluster recorded against an object, and the pods' own stdout — without a kubeconfig.
When a cell has no binding
The binding name comes from a token-scoped read. Signed out, cells fall back to the component's deploy history, which is served from the delivery index and needs no token. That is a worse answer than the manifest and much better than a dead link.
The binding name is deliberately not reconstructed as <component>-<environment>.
That convention holds for every binding in this cluster today and breaks on the ones
dns_safe() truncates at 60 characters — silently, on the longest names, which are the
least likely to be spot-checked.
Something not deployed anywhere
A platform construct has no binding, so its drill-down is what it expands into: the templates it renders, with the kind, API group, name pattern, target plane and the condition each object is included under.
Resource types, component types, traits, workflows and project types — all one page each, all with an What it expands into panel.
Browse the constructs →${metadata.name} is printed exactly as the construct writes it. Substituting a
plausible value would produce a name that looks real and is not, and a reader comparing
it against a live object would be comparing against a guess.
A trait that only patches renders nothing. patches is a third verb, kept apart from
renders and creates, because listing a patched Deployment under the same heading
would claim the trait produces one.