[mathur07]: ## Proposed Solution Extend the same `generateName`-sanitization logic from #9826 (currently only applied in the `PipelineSpec` branch) into the `PipelineRef.Resolver` branch, keeping the existing cluster-resolver `kind=pipeline` override as a higher-priority path since it already yields a correct, stable name when present. Concretely, in `pkg/reconciler/pipelinerun/pipelinerun.go`: ``` func propagatePipelineNameLabelToPipelineRun(pr *v1.PipelineRun) error { if pr.ObjectMeta.Labels == nil { pr.ObjectMeta.Labels = make(map[string]string) } if _, ok := pr.ObjectMeta.Labels[pipeline.PipelineLabelKey]; ok { return nil } switch { case pr.Spec.PipelineRef != nil && pr.Spec.PipelineRef.Name != "": pr.ObjectMeta.Labels[pipeline.PipelineLabelKey] = pr.Spec.PipelineRef.Name case pr.Spec.PipelineSpec != nil: pr.ObjectMeta.Labels[pipeline.PipelineLabelKey] = sanitizedPipelineRunName(pr) case pr.Spec.PipelineRef != nil && pr.Spec.PipelineRef.Resolver != "": // Default: sanitized generateName (or full name if generateName is absent), // mirroring the PipelineSpec branch's cardinality-reduction behavior. pr.ObjectMeta.Labels[pipeline.PipelineLabelKey] = sanitizedPipelineRunName(pr) // https://tekton.dev/docs/pipelines/cluster-res

Context: GitHub issue tektoncd/pipeline#10686 (open, 3 comments, reported 2026-09-01): ## Expected Behavior For a PipelineRun that references its Pipeline via a resolver (git, bundle, hub, etc.), the `pipeline` label on `tekton_pipelines_controller_pipelinerun_*` / `tekton_pipelines_controller_taskrun_*` metrics should reflect a stable identifier for the pipeline (e.g. derived from `generateName`, matching the fix applied in #9826 for inline `PipelineSpec`), so that all runs of the same pipeline aggregate under the same metric series. ## Actual Behavior For any `pipelineRef.resolver` other than `cluster` (i.e. `git`, `bundle`, `hub`), `propagatePipelineNameLabelToPipelineRun`