Plugin integrations can now retrieve the image generated by a completed packshot through any documented path. Previously, GET /api/v1/plugin/jobs/{id}, GET /api/v1/plugin/jobs, and the job.completed webhook all returned an empty outputs array even though the asset had been uploaded to Supabase Storage, and POST /api/v1/plugin/jobs/{id}/refresh-url returned HTTP 410. The only way to download the image was a direct service-role call, which plugin clients cannot make.
The fix wires the recorded output path into a fresh seven-day signed URL on every read. The webhook payload now carries the same signed URL plus the storage metadata required for later refresh requests. The refresh-url endpoint additionally falls back to projecting from cg_jobs.output_path when the original webhook payload pre-dates this change, so historical packshots completed before the rollout become reachable again without redelivery. HTTP 410 is now reserved for the case where the underlying object has genuinely been purged from storage.