{"record":{"id":"4b47d384257d366c","repo":"linera-io/linera-protocol","slug":"no-base-jobs-found","errorCode":null,"errorMessage":"No base jobs found!","messagePattern":"No base jobs found!","errorType":"exception","errorClass":"anyhow","httpStatus":null,"severity":"error","filePath":"linera-summary/src/performance_summary.rs","lineNumber":45,"sourceCode":"    /// runtime comparison.\n    pub async fn init(github: Github, tracked_workflows: HashSet<String>) -> Result<Self> {\n        let workflows_handler = github.workflows_handler();\n        let workflows = github\n            .workflows(&workflows_handler)\n            .await?\n            .into_iter()\n            .filter(|workflow| tracked_workflows.contains(&workflow.name))\n            .collect::<Vec<_>>();\n\n        let base_jobs = Box::pin(github.latest_jobs(\n            github.context().base_branch(),\n            \"push\",\n            &workflows_handler,\n            &workflows,\n        ))\n        .await?;\n        if base_jobs.is_empty() {\n            bail!(\"No base jobs found!\");\n        }\n\n        let pr_jobs = Box::pin(github.latest_jobs(\n            github.context().pr_branch(),\n            \"pull_request\",\n            &workflows_handler,\n            &workflows,\n        ))\n        .await?;\n        if pr_jobs.is_empty() {\n            bail!(\"No PR jobs found!\");\n        }\n\n        Ok(Self {\n            github,\n            ci_runtime_comparison: CiRuntimeComparison::from_jobs(base_jobs, pr_jobs)?,\n        })\n    }","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/linera-io/linera-protocol/blob/6c226ddcb332ef55118dc8d0aafbd093d5420899/linera-summary/src/performance_summary.rs#L27-L63","documentation":"Raised by PerformanceSummary::init in the linera-summary CI tooling when GitHub's latest_jobs call returns zero jobs for the base branch with event type 'push'. The tool builds a CI runtime comparison between PR and base branch, so it aborts without a baseline. Note that the tracked-workflow filter is applied before jobs are fetched, so a workflow-name mismatch also produces zero jobs.","triggerScenarios":"Calling PerformanceSummary::init when latest_jobs(base_branch, \"push\", workflows_handler, workflows) returns an empty Vec. This happens when the filtered `workflows` list is empty because tracked_workflows entries don't match the repo's workflow names, the base branch has no completed push-event runs of those workflows, or the GitHub token/context points at the wrong repository or branch.","commonSituations":"The tracked workflow list in the tool's config has drifted from the actual .github/workflows 'name:' fields; running against a fresh branch or fork with no green base-branch CI runs; an expired or scoped-down GITHUB_TOKEN that can read workflows but not workflow runs; running the tool locally with the wrong repository context.","solutions":["Verify each tracked workflow name matches the 'name:' field in .github/workflows files exactly (case-sensitive)","Ensure the base branch has at least one completed run of those workflows triggered by a push event","Check the base branch name the tool derived from the GitHub context (env vars like GITHUB_REF / base branch of the PR)","Confirm the GITHUB_TOKEN has actions:read scope and is not expired","Add debug logging of the fetched workflows list to see what the filter actually matched"],"exampleFix":"# before: tracked names drifted from the workflows\ntracked_workflows = {\"CI\", \"Docker\"}\n\n# after: names match .github/workflows 'name:' fields exactly\ntracked_workflows = {\"Rust\", \"Wasm\", \"Docker Build\"}","handlingStrategy":"validation","validationCode":"// Before init: confirm the tracked names match real workflows, with a diagnostic.\nlet workflows = github.workflows(&github.workflows_handler()).await?;\nif workflows.iter().all(|w| !tracked_workflows.contains(&w.name)) {\n    let known: Vec<_> = workflows.iter().map(|w| w.name.clone()).collect();\n    anyhow::bail!(\"tracked_workflows match no workflow; known workflows: {known:?}\");\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = PerformanceSummary::init(github, tracked).await {\n    if e.to_string().contains(\"No base jobs found!\") {\n        // skip posting the PR comment rather than failing the whole CI job\n    }\n}","preventionTips":["Keep the tracked workflow list in sync with the 'name:' fields in .github/workflows","Never run the summary tool before the base branch has one green push-event run","Fail fast on an empty matched-workflows list with a message listing the available workflow names"],"tags":["github-actions","ci","linera-summary","configuration"],"backgroundTag":"github-actions-jobs-not-found","analyzedSha":"6c226ddcb332ef55118dc8d0aafbd093d5420899","analyzedAt":"2026-08-22T22:49:09.787Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}