Issue
update_check_run (PATCH /repos/{owner}/{repo}/check-runs/{id}) intermittently fails with 404 Not Found for a check-run that does exist — and the whole PipelineRun creation is aborted and reported as a failed check ("There was an error creating the PipelineRun: ... cannot use the API on the provider platform to create a in_progress status: PATCH .../check-runs/: 404").
Root cause (verified)
GitHub API read-after-write eventual consistency. Forensics from a burst on 2026-08-11 (PaC v0.45.0, GitHub App auth):
- Controller log shows the PATCH failing 200-630 ms after the check-run was created (same reconcile burst;
operation":"update_check_run","duration_ms":630,...,"status_code":404).
- Querying the SAME four check-run IDs ~1h later returns 200 OK — the check-runs existed all along; the PATCH simply hit a replica that had not seen the fresh row yet.
- Reproduces under bursts (e.g. a merge queue doing update-branch on several PRs), where create-to-update gaps are milliseconds. 11 occurrences in 12h across two repos.
Impact
The PipelineRun is never created; the PR is left with a permanently-red check that no /retest can revive (CEL event == "pull_request" gates), so automation that treats red as terminal deadlocks. We work around it with a janitor that detects the failure signature and does close+reopen to re-emit the PR event.
Suggested fix
Retry with short backoff (e.g. 3x with 500ms-1s) on 404 responses to check-run update/create-status calls made shortly after check-run creation. A 404 immediately after a successful create is far more likely to be replica lag than a truly missing resource.
Environment
- Pipelines-as-Code v0.45.0 (images
ghcr.io/tektoncd/pipelines-as-code/*:stable), GitHub App provider, self-hosted Tekton on k8s.
Issue
update_check_run(PATCH/repos/{owner}/{repo}/check-runs/{id}) intermittently fails with 404 Not Found for a check-run that does exist — and the whole PipelineRun creation is aborted and reported as a failed check ("There was an error creating the PipelineRun: ... cannot use the API on the provider platform to create a in_progress status: PATCH .../check-runs/: 404").Root cause (verified)
GitHub API read-after-write eventual consistency. Forensics from a burst on 2026-08-11 (PaC v0.45.0, GitHub App auth):
operation":"update_check_run","duration_ms":630,...,"status_code":404).Impact
The PipelineRun is never created; the PR is left with a permanently-red check that no
/retestcan revive (CELevent == "pull_request"gates), so automation that treats red as terminal deadlocks. We work around it with a janitor that detects the failure signature and does close+reopen to re-emit the PR event.Suggested fix
Retry with short backoff (e.g. 3x with 500ms-1s) on 404 responses to check-run update/create-status calls made shortly after check-run creation. A 404 immediately after a successful create is far more likely to be replica lag than a truly missing resource.
Environment
ghcr.io/tektoncd/pipelines-as-code/*:stable), GitHub App provider, self-hosted Tekton on k8s.