Gitea does not expand a dynamic fromJson matrix (the job name stayed literal and it queued with no matching runner). Instead, compute cosmic/remote booleans in a changes job and gate static-matrix build jobs with job-level if.