Summary
Track non-blocking follow-ups from the GET /operator/runs implementation merged in #1035.
Follow-ups
- Evaluate run-index read amplification: the endpoint can perform up to
authorized repos × MAX_RUNS_PER_REPO run-state object reads per request, while returning at most 100 summaries. Current rate limits bound blast radius, but higher repo/run counts may need an early global short-circuit, smaller per-repo cap, or a stronger index.
- Consider deduplicating bindings before the authz fan-out cap: duplicate channel bindings for one
owner/repo can consume cap slots before owner/repo dedup, reducing unique repo coverage below the nominal cap.
- Define the long-term run-state retention policy:
listWithMetadata sorts after bounded S3 pagination, so extremely large per-repo run-state prefixes can miss newer objects beyond the list iteration cap. S3 lifecycle cleanup is the likely operational mitigation.
Context
These are not correctness or security blockers for #1035. They are scale/operational fairness follow-ups for larger installations or long-lived deployments.
Summary
Track non-blocking follow-ups from the GET /operator/runs implementation merged in #1035.
Follow-ups
authorized repos × MAX_RUNS_PER_REPOrun-state object reads per request, while returning at most 100 summaries. Current rate limits bound blast radius, but higher repo/run counts may need an early global short-circuit, smaller per-repo cap, or a stronger index.owner/repocan consume cap slots before owner/repo dedup, reducing unique repo coverage below the nominal cap.listWithMetadatasorts after bounded S3 pagination, so extremely large per-repo run-state prefixes can miss newer objects beyond the list iteration cap. S3 lifecycle cleanup is the likely operational mitigation.Context
These are not correctness or security blockers for #1035. They are scale/operational fairness follow-ups for larger installations or long-lived deployments.