π― Affected Service(s)
UI Service (with a controller-side cause)
π¦ Impact/Severity
Minor inconvenience
π Bug Description
The Harness column in the Actor Templates table on the Substrate page always shows β. Two neighboring fields are dead in the same way: the golden: β¦ line under each template name, and managedByKagent.
Cause is #2638, which moved actor templates from the Kubernetes ActorTemplate CRD to ate-api.
- Before:
ActorTemplateForRevision stamped kagent.dev/harness on the template, and listSubstrateCRs read it back into HarnessName.
- Now: ate-api templates carry no such labels, and
listATEState never sets HarnessName, GoldenActorID, or ManagedByKagent.
- The fields are still declared on
SubstrateActorTemplate (go/core/internal/service/system/service.go), so nothing fails β the columns just can't ever have a value.
π Steps To Reproduce
- Bring up a cluster with
scripts/setup-cluster/setup-cluster.sh.
- Create an AgentTemplate so at least one actor template exists.
- Open the Substrate page in the UI and find the Actor Templates table.
- The Harness column reads
β for every row.
π€ Expected Behavior
Each row names the harness that produced the template.
π± Actual Behavior
β on every row.
π Additional Context
Two more regressions on the same table
Both come from the same move to ate-api, and both are cosmetic rather than empty:
- Sandbox class reads
SANDBOX_CLASS_GVISOR. listATEState calls .String() on the ate-api enum; the CRD field it replaced was a plain string, so the column used to read gvisor.
- Golden snapshot now reads
atespace/name, via objectRefString. It used to be the bare snapshot name.
Searching the table by harness also stopped matching, since the row's search string includes harnessName and goldenActorId. That follows from the empty fields above rather than being separate.
Not issues, for the record
- Phase values changed from CRD strings such as
GoldenSnapshotPending to a derived Pending / Failed / Ready. The page treats phase as open-ended and the ready count compares lowercased, so both still work.
- With ate-api unreachable the table is empty instead of falling back to Kubernetes CRs. Inherent to the move;
ateApiError still surfaces on the page.
- The Actors, Workers, and Worker Pools tables are unaffected β every field still has a source.
Why not derive the harness from the template name
revisionActorTemplateName builds <agentTemplate>-<harness>-<revisionShort>, so the harness is readable from the Name column, but parsing it back is unreliable. Agent template and harness names may both contain dashes, and truncateDNS1123To caps the combined agentTemplate-harness at 50 characters before the digest is appended, so long names lose part or all of the harness segment.
Fix
Carry the harness name β and the golden actor ID β in ate-api template metadata, and populate the fields from there. Alternatively drop the three empty fields and their UI columns, so the table stops showing values it can never fill. Sandbox class needs formatting back to the short form.
No test covers any of the three empty fields now, which is why CI stayed green through #2638.
Related files
go/core/internal/service/system/service.go β listATEState, SubstrateActorTemplate, objectRefString
go/core/v2/substrate/actor_template.go β ActorTemplateForRevision, revisionActorTemplateName, truncateDNS1123To
ui/src/pages/SubstratePage.tsx β Actor Templates columns and row search string
π€ written by Claude
π― Affected Service(s)
UI Service (with a controller-side cause)
π¦ Impact/Severity
Minor inconvenience
π Bug Description
The Harness column in the Actor Templates table on the Substrate page always shows
β. Two neighboring fields are dead in the same way: thegolden: β¦line under each template name, andmanagedByKagent.Cause is #2638, which moved actor templates from the Kubernetes
ActorTemplateCRD to ate-api.ActorTemplateForRevisionstampedkagent.dev/harnesson the template, andlistSubstrateCRsread it back intoHarnessName.listATEStatenever setsHarnessName,GoldenActorID, orManagedByKagent.SubstrateActorTemplate(go/core/internal/service/system/service.go), so nothing fails β the columns just can't ever have a value.π Steps To Reproduce
scripts/setup-cluster/setup-cluster.sh.βfor every row.π€ Expected Behavior
Each row names the harness that produced the template.
π± Actual Behavior
βon every row.π Additional Context
Two more regressions on the same table
Both come from the same move to ate-api, and both are cosmetic rather than empty:
SANDBOX_CLASS_GVISOR.listATEStatecalls.String()on the ate-api enum; the CRD field it replaced was a plain string, so the column used to readgvisor.atespace/name, viaobjectRefString. It used to be the bare snapshot name.Searching the table by harness also stopped matching, since the row's search string includes
harnessNameandgoldenActorId. That follows from the empty fields above rather than being separate.Not issues, for the record
GoldenSnapshotPendingto a derivedPending/Failed/Ready. The page treats phase as open-ended and the ready count compares lowercased, so both still work.ateApiErrorstill surfaces on the page.Why not derive the harness from the template name
revisionActorTemplateNamebuilds<agentTemplate>-<harness>-<revisionShort>, so the harness is readable from the Name column, but parsing it back is unreliable. Agent template and harness names may both contain dashes, andtruncateDNS1123Tocaps the combinedagentTemplate-harnessat 50 characters before the digest is appended, so long names lose part or all of the harness segment.Fix
Carry the harness name β and the golden actor ID β in ate-api template metadata, and populate the fields from there. Alternatively drop the three empty fields and their UI columns, so the table stops showing values it can never fill. Sandbox class needs formatting back to the short form.
No test covers any of the three empty fields now, which is why CI stayed green through #2638.
Related files
go/core/internal/service/system/service.goβlistATEState,SubstrateActorTemplate,objectRefStringgo/core/v2/substrate/actor_template.goβActorTemplateForRevision,revisionActorTemplateName,truncateDNS1123Toui/src/pages/SubstratePage.tsxβ Actor Templates columns and row search stringπ€ written by Claude