Skip to content

ateapi: one bad actor row fails the whole ListActors response, with no indication which actor caused it #1401

Description

@mayawang

Expected Behavior

A single actor whose serialized form cannot be decoded by a caller should cost that caller that
actor
— an error naming it, a skipped row, a partial response with a warning. Losing the view of
every actor in the atespace is disproportionate to the fault.

Actual Behavior

ListActors returns a single message containing every actor, so any decode failure on any row fails
the entire response for every caller. Observed as:

Error: failed to list actors: rpc error: code = Internal desc = grpc:
failed to unmarshal the received message: string field contains invalid UTF-8

There is nothing in the error identifying the actor, so recovery starts with an unbounded search
across the atespace. In the case that produced this (see the schema issue above), the trigger was
one running actor among many, and the only way to find it was to decode the wire bytes by hand.

Steps to Reproduce the Problem

  1. Produce any actor whose row a given client cannot decode. The reproducible route today is the tag
    reuse described in the linked issue: an old client plus one RUNNING actor with a
    worker_assignment of 128 bytes or more.
  2. Call ListActors for that atespace, e.g. kubectl-ate get actors -a <atespace>.
  3. Observe that the response fails entirely, that no other actor is listed, and that nothing in the
    error names the responsible actor.

Specifications

  • Version: main at ea3bdc32 (2026-09-02); rpc ListActors at ateapi.proto:102, response
    ListActorsResponse at :1588.
  • Platform: any.

Notes

Worth fixing on its own merits regardless of the schema issue: any future decode-affecting change,
on any field, inherits this blast radius. Pagination already exists on this RPC, so per-page partial
success plus a per-row error list is a natural shape.

Related to #1396

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/apiUser-facing API changeskind/bugSomething isn't working / bugfixesprio/P1Important but not critical

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions