Hey, thanks for the detailed report. It already has everything we need to diagnose this.
This looks like a gap in our docs, not a code bug. The artifact pipeline for a self-hosted worker works like this: the agent writes a file to the local artifact directory → the exec-daemon on the worker uploads it to Cursor’s artifact storage AWS S3 in us-east-1 via a presigned PUT → the V1 API lists artifacts by reading objects from that bucket. If outbound HTTPS from the worker pod to S3 is blocked by an egress policy, the upload quietly becomes a no-op, the run still ends as FINISHED, and /artifacts returns an empty list.
Please check that egress from the cursord namespace allows outbound HTTPS to:
cloud-agent-artifacts.s3.us-east-1.amazonaws.com (or more broadly, AWS S3 in us-east-1)
In the current setup docs we only list api2.cursor.sh, api2direct.cursor.sh, downloads.cursor.com. Artifact storage is not mentioned there. That is a known docs gap and we’re fixing it on our side.
Quick answers to your questions:
The file will show up in /v1/agents/{id}/artifacts only after the exec-daemon successfully uploads it to S3. Writing to /workspace/artifacts/ locally is not enough.
The artifacts/... prefix is enough. There are no extra constraints on the path or filename.
Yes, that’s exactly what happens. A run can report a local write, but if the upload step failed egress, proxying, the index will be empty.
In this case the likely reason is blocked egress to S3. Also, right now the upload path does not respect the HTTPS_PROXY env var, so if you require mandatory proxying that is another possible cause.
There is no separate per-run diagnostic endpoint. The best signal on your side is the exec-daemon logs in the worker pod during or right after the run finishes. You should see PUT attempts and any network errors there.
If you open egress and it still does not work, send the exec-daemon logs from one of those pods bc-2b906ba6-... or any recent one and we can dig deeper.