- Fix double-expansion race: wrap claimMatrixExpansion (conditional UPDATE on
is_matrix_evaluated=false AND status=Blocked) + InsertActionRunJobs in a
single db.WithTx transaction; second concurrent caller gets n==0 and the
transaction rolls back without inserting duplicate jobs
- Remove matrix_cache.go, matrix_metrics.go, matrix_metrics_prometheus.go, and
matrix_metrics_test.go
- Replace HasMatrixWithNeeds string matching with a YAML tree walker that only
reports true when a ${{ ... }} expression block inside the matrix key
contains needs.<id>.outputs.<key>; avoids false positives on job names like
needs.review-runner that appear as plain YAML values
- Adapt the logging
Co-Authored-By: Claude <claude-sonnet-4-5@anthropic.com>