The decision map
The idea in one line: Most recurring distro chores hide a typed question. Call a tool when one gives the exact answer fast, and model only the questions that are frequent, slow to check and labelled for free.
Why this matters
Section titled “Why this matters”Choosing which questions to model is the biggest decision in this case study. Get it wrong one way and you train a model to imitate a tool that already answers exactly, in seconds, for free. Get it wrong the other way and you skip a question whose labels the build farm writes for you every day.
Where the time goes showed the hours pile up in diagnosis, waiting and selection. This lesson turns them into a map of 23 typed questions, marks which have exact oracles and free labels, and covers the AI Fedora already runs and the policies that limit what a co-pilot may do.
From chore to typed question
Section titled “From chore to typed question”Recall the contract from anatomy of Jev. A decision model takes a state (text or JSON describing the situation) plus typed questions, and returns a probability for each answer you defined in advance. Jev has three production types:
- Choice: pick one of up to 255 options; returns a distribution over them.
- Score: rate on 2 to 10 ordered levels; returns a distribution and an expected score.
- Noul (short for Bernoulli): a yes/no question; returns one probability of “yes”.
A worked example. It’s 3 a.m. and an akmods CI run fails at its “Test Image” step. A maintainer asks three things, often without noticing they’re separate:
State: the failed step's last 2,000 tokens of log, plus run metadata
Noul "Will a plain retry pass?" P(yes) = 0.85Choice "Which failure class is this?" transient-network 0.80 | kmod-vs-kernel 0.10 | other 0.10Score "How risky is this kernel bump for kmods, 1-5?" expected score 1.4The numbers are illustrative, but 0.85 is a sensible start: 40 of 47 re-run akmods jobs passed, so it’s the base rate before the model reads the log. Each answer maps to an action (retry, run the network playbook, hold the kernel), and each action has a cost when it’s wrong. That’s how probabilities become automation. Writing good questions and label guides is its own craft: see designing the questions.
The map
Section titled “The map”Here are 23 recurring decisions in distro work as typed questions. The “time each” column is the researcher’s estimate, since no time logs exist. “Verifiable” says how cheaply and reliably the true answer arrives.
| # | Typed question | Type | Free label source | How often | Time each (est.) | Verifiable | Who answers |
|---|---|---|---|---|---|---|---|
| 1 | Will this package set resolve on Fedora 44, weak deps off? | Noul | the solver (dnf --assumeno) | every package change | 1-5 min | exact, seconds | Oracle |
| 2 | Which failure class is this build log? | Choice, about 12 | fix diff, retry, GCC 15 list, Log Detective | Koji about 780 a day | 5-30 min | high | Model (first three) |
| 3 | Will a plain retry of this failed job pass? | Noul | the retry’s outcome | 85% of akmods retries pass | 2-10 min plus CI wait | exact, after one retry | Model (first three) |
| 4 | Which package provides this missing header or command? | Choice | dnf provides, pacman -F | each missing-dependency failure | 2-10 min | exact | Oracle |
| 5 | Does feature F need recommended package R? | Noul | the feature’s check task | each package added | 10-30 min | medium, needs a run | Model plus oracle |
| 6 | Which source for package P: Fedora, RPM Fusion, Terra, COPR or upstream? | Choice, 5 | the preference rule; 187 labelled rows | per package | 2-10 min | rule-checkable | Rule or few-shot |
| 7 | Will the operator approve feature X? | Noul | 33 approved, 25 rejected | per proposal | 5-20 min | only the operator | Pre-screen only |
| 8 | Is this bot version-bump PR safe to auto-merge? | Noul | merged, CI, later reverts | r-ryantm: 45,153 PRs a year | 1-5 min | medium | Model |
| 9 | Will this kernel bump break out-of-tree modules (nvidia-open, ZFS)? | Score, 5 | UB akmods CI, kernel pins | weekly | 15-60 min | exact (build) | Model (with #10) |
| 10 | Will this package or base-image bump break the image build? | Noul | image CI history; Bodhi karma | daily | 10-60 min | exact (build) | Model (first three) |
| 11 | Will this image boot NVIDIA on Turing with Secure Boot on? | Noul | user reports | per release | hours, on hardware | low | Human; model routes |
| 12 | Is this CVE relevant to our version and config? | Choice, 4 | Debian tracker, Ubuntu, OSV | kernel about 27 a day | 5-60 min | medium | Model, after inheriting upstream |
| 13 | What priority does this CVE get here? | Score, 4 | Debian urgency, EPSS | as #12 | 2-10 min | medium | Model |
| 14 | Should this upstream commit be backported? | Noul | reached stable trees or not | per upstream release | 5-15 min | medium-high | Model (proven 2018) |
| 15 | Is this downstream patch now upstream? | Noul | the patch fails to apply | each rebase | 5-20 min | exact | Oracle |
| 16 | Will this random embedded config build? | Noul | Buildroot autobuilders | thousands a month | 97 min of compute (median) | exact | Model as pre-filter |
| 17 | How long will this build take? | Score | rpmeta’s 705,766 rows | every build | none | exact | Model (exists) |
| 18 | Which known issue does this bug report match? | Choice plus “new” | issues closed as duplicates | Bazzite about 6 a day | 5-15 min | medium | Model |
| 19 | How severe is this bug report? | Score, 4-5 | Bugzilla severity | as #18 | 2-5 min | low-medium | Model; human confirms |
| 20 | Is this comment spam, or AI-generated? | two Nouls | moderator actions | continuous | 1 min | medium | Model |
| 21 | Is this config key valid in the installed version? | Noul | mango -c <file> -p | each config change | 5-30 min | exact | Oracle |
| 22 | For stack install <name>: Flatpak, layered RPM, transient, or ask? | Choice, 4 | the user’s pick; repo lookups | per install | seconds | high | Lookups; model for fuzzy names |
| 23 | Is this agent’s change inside the requested scope? | Noul | operator accepts or reverts | every agent change | 1-10 min | medium | Model, guarding the agent |
A few terms. Bodhi is Fedora’s update system, where testers give each update karma (+1 or −1 votes). EPSS is a machine-learning model that scores how likely a CVE is to be exploited. Stack Linux is the operator’s planned public distro: stack install would pick an install method for a name, and stack doctor would gather Secure Boot state, the GPU driver and failed services into a report (tsaqib/terra-fedora/STACK-CLI.md:100-151).
Use the oracle; don’t imitate it
Section titled “Use the oracle; don’t imitate it”An oracle here is a tool that gives the true answer, not a guess. Five rows have exact, fast oracles:
- #1, the solver. Dependency solving is NP-complete in theory (no known method is fast for every case) (Abate et al., arXiv 2011.07851), but libsolv inside dnf5 answers “does this set resolve?” exactly, in seconds.
- #4, file-provides queries.
dnf providesandpacman -Fsay which package ships a file. - #15, patch application. Either the patch applies or it doesn’t.
- #21, config validators.
mango -c <file> -preports bad keys (tsaqib/mycachy/CLAUDE.md:76). - The lookups in #22, which are repository queries.
Why modelling these is a mistake, in numbers: terra-fedora has 187 package rows. A “will this resolve?” model at 95% accuracy gets about 187 × 0.05 ≈ 9 wrong. The solver gets 0 wrong, in seconds. Call the tool and spend the model budget elsewhere.
So the rule is simple:
Is there a tool that gives the exact answer?|+-- yes, in seconds -----------> call the tool. No model.| (solver, provides, validator)|+-- yes, but it takes 20-180 min -> the model predicts now,| the tool confirms later|+-- no (hardware, taste) -------> the model only routes; a human decidesThe best model targets have three things at once: high frequency, a slow oracle, and free labels. On the map those are #2, #3, #8, #9, #10, #12 and #16. Two rows can’t be automated: hardware truth (#11) needs a real laptop, and taste (#7) is the product itself, since the 25 rejected features are the distro’s identity. A model can only pre-screen and route those.
The labelled data that already exists
Section titled “The labelled data that already exists”A naturally labelled outcome is a label the world produces anyway, such as “this build failed”, “this PR merged” or “this retry passed”, so no annotator is needed. The labels lesson explains why this is the 10x data source. Distro work is unusually rich in it.
| Source | Free label | Size | Access | Licence or terms | Labels # |
|---|---|---|---|---|---|
| Fedora Koji | build and task state, logs | 12 months: 9,106 failed builds; 284,204 failed tasks | XML-RPC hub, open | package licences; logs public | 2, 3 |
| Fedora dist-git | the fix: spec diff to the next good build | every Fedora package | raw files, open | package licences | 2 |
| COPR | results per build | not counted (stats behind Anubis) | api_3, open | per project | 2, 3 |
| rpmeta dataset | build duration plus hardware | 705,766 rows | Hugging Face | GPL-3.0 tag | 17 |
| Log Detective | human notes on cause and fix | 1,228 reports; 3,367 Q&A pairs; 160 MB dump | Hugging Face; site download | CDLA-Permissive-2.0 | 2 (eval) |
| Bodhi | karma; stable, obsolete, unpushed | Fedora 44: 30,358 stable, 911 obsolete, 106 unpushed | REST JSON, open | public | 10 |
| Red Hat Bugzilla | resolution; duplicates via dupe_of | 75,520 Fedora bugs closed as duplicates | REST API, open | public | 18, 19 |
| Debian security tracker | per-CVE, per-release status | 87 MB JSON | HTTP | public | 12, 13 |
| OSV | affected version ranges; kernel fix commits | Linux zip 59 MB; 8,100 kernel CVEs in 2026 to date | bucket, API | per source, e.g. Ubuntu CC-BY-SA 4.0, Chainguard CC-BY-NC-ND | 12, 13 |
| nixpkgs Hydra | pass or fail per job | 215,592 jobs in one evaluation | JSON API, slow | MIT | 2, 10 |
| r-ryantm PRs | merged, closed, open, CI | 45,153 PRs a year | GitHub API | GitHub terms | 8 |
| AUR | out-of-date flag, votes, orphaned | 123,268 packages; 10.6 MB dump | dump and RPC, open | per package | 8 |
| Universal Blue CI | job results, failed step, retry attempts | 75,740 runs across 5 repos | GitHub API; logs kept 90 days | GitHub terms | 3, 9, 10 |
| Buildroot autobuilders | OK, failed or timeout per random config, with log | 742,714 builds, 51.8% failed | open to plain clients | GPL-2.0 project | 16 |
Counts were measured from each public API or dump on 2026-10-28. See Log Detective’s dataset, rpmeta’s, Buildroot stats and OSV data. One near-miss: Renovate’s Merge Confidence crowd data would suit #8, but it covers npm, PyPI and other language ecosystems, not distro packages, and its algorithm is private (docs).
Two labels the build farm writes for you. Human annotation won’t scale: Log Detective’s 1,228 reports are under half a percent of a single year’s 284,204 failed Koji tasks. But the farm records what happened next:
- The retry outcome. A failed job re-run with identical inputs that then passes was transient.
- The fix diff. Diff the recipe against the next successful build of the same package, and map the change to a class. Building the co-pilot turns this into code.
Access is narrowing. Anubis, an anti-bot wall that challenges browser-like clients, now fronts Fedora’s web pages, the AUR, Buildroot and Log Detective’s site; plain API clients still pass. GitHub deletes public Actions logs after 90 days. The research reports even disagree on Koji: one pulled full-year counts, another timed out on its count queries. Plan for pagination and a nightly job.
The traps. Free labels leak in predictable ways; one survey found leakage errors in 329 papers across 17 fields (Kapoor & Narayanan, 2022-07-14). Drop every field written after the decision, such as a bug’s final resolution. Split by time and group by package, or near-duplicate failures land on both sides. Remember that merged isn’t correct and stable isn’t tested: one Fedora update went from submitted to stable in four minutes with karma 0. And keep the date with every label, because policies drift. More in verifiable rewards and evals and, for the licence column, data rights.
The AI already in distro work
Section titled “The AI already in distro work”Log Detective: an LLM that explains failures
Section titled “Log Detective: an LLM that explains failures”Log Detective is a Fedora service that explains failed RPM build logs with a large language model, aimed at newer packagers. It first cuts the log down with Drain, an algorithm that groups log lines into templates so the rare, informative lines stand out (fedora-copr/logdetective, read 2026-10-28).
- Deployment. Since May 2026, Packit (the service that runs builds for Fedora’s dist-git pull requests) requests an analysis after every failed scratch build (Fedora Magazine, 2026-05-13). The setup example loads a 3.9 GB Granite 4.0 model file. Its authors say an explanation takes about a minute (DevConf.CZ 2025 talk).
- Models and data. The fedora-copr Hugging Face org holds 13 models, including
SmolLM2-1.7B-Instruct-LogDetective, and thelog_detective_qnadataset (3,367 Q&A pairs, 640 of them a test split). - Results. None published. The Magazine article says the tool likely offers little to people with years of experience, and the SmolLM2 model card reports no evaluation.
The deeper problem is the output type. An explanation is free text, so you can’t score it automatically. A typed answer (“which class?”, “transient?”) can be scored against outcomes the build farm already records.
rpmeta: the closest thing to a Jev-like model
Section titled “rpmeta: the closest thing to a Jev-like model”rpmeta predicts how long an RPM build will take from package metadata and builder hardware. It’s a gradient-boosting model (LightGBM and XGBoost: many small decision trees, each correcting the errors of the last), trained on 705,766 COPR build records and served over a REST API (fedora-copr/rpmeta, read 2026-10-28). No accuracy is published. So Fedora runs two models with two philosophies: an LLM explainer and a cheap, typed predictor. The second is the Jev-like one.
Older precedents
Section titled “Older precedents”- Kernel backports, 2018. Sasha Levin trained a neural network on “should this commit go to the stable kernels?”, labelled by which commits had reached stable. It reached about 85% precision (of the commits it picked, how many were right) and 80% recall (of the right commits, how many it picked), for about $2,000 of GPU time (LWN, 2018-09-12). That’s a single source.
- Moderation. Universal Blue ran GitHub’s
ai-moderatoraction to label issuesspamorai-generated; Bazzite removed it on 2026-09-29 as an “action that’s being sunset” (ublue-os/bazzitecommitd3c4d31f25). - CVE scoring. EPSS v3 claims to be 82% better than earlier EPSS models at spotting exploited vulnerabilities (arXiv 2302.14172), again from a single source.
What the projects allow
Section titled “What the projects allow”Distro projects have written AI policies, and they decide what a co-pilot may do upstream.
| Project | When | Rule |
|---|---|---|
| Gentoo | voted 2024-04-14 | “expressly forbidden” to contribute content created with AI tools (wiki); one council member called it “slightly performative”, since it can’t be enforced (LWN) |
| NetBSD | 2024 | LLM output “is presumed to be tainted code” and needs core’s written approval (guidelines) |
| QEMU | 2025 to now | declines contributions with known or suspected AI use (provenance); a May 2026 proposal would allow tests, docs and mechanical changes (Phoronix); whether it merged is unclear |
| Fedora | approved 2025-10-22 | AI allowed with an Assisted-by: trailer, but never “the sole or final arbiter”; it “does not prohibit… objective technical validation, such as CI/CD pipelines, automated testing, or spam filtering” (policy) |
| Debian | vote 2026-08-15 to 08-28 | “Responsible Use of Generative AI” won 281 to 126: Debian “neither endorses nor prohibits”, and large-scale automated actions need prior discussion; the ban option lost 144 to 257 (vote 2026/002) |
| nixpkgs | enacted 2026 | Assisted-by: with the model version; no unreviewed automation and no automation as the sole basis for merging; existing bots exempt (CONTRIBUTING.md) |
| Linux kernel | current docs | Assisted-by: tag; AI agents must not add Signed-off-by (docs) |
What it means. Every ban or restriction targets content in contributions. A decision model that classifies a log, retries a job, ranks CVEs or flags spam contributes no content, and Fedora names that zone explicitly. The generative half of a co-pilot carries the policy risk, and only when its patches flow upstream. For a personal derivative like terra-fedora, none of these rules binds until work goes to Fedora, COPR or Terra.
The state of the art, and what’s still open
Section titled “The state of the art, and what’s still open”The frontier here is the plumbing, not the model. Typed decisions in kernel maintenance worked in 2018. Fedora’s newest models are an LLM explainer and a boosted-tree regressor. The strongest “agent” by volume is a bot with no language model, behind 41% of merged nixpkgs pull requests. The research found no published typed failure classifier scored against build-farm outcomes.
Open problems:
- No accuracy for Log Detective. Its DevConf talk aims for near-perfect explanations; Fedora Magazine says it offers little to experts. No numbers settle it.
- Merge is a skewed label. Bot PRs merge 92-99% of the time, so “safe to merge” needs revert and regression signals too.
- Hardware truth has no dataset linking image versions to boot success on specific GPUs.
- Research gaps. Recent academic work on predicting distro build failures, and Canonical’s AI experiments in packaging, couldn’t be verified.
Check yourself
Section titled “Check yourself”Which three properties make a decision a good model target? Name two decisions that have all three.
High frequency, a slow or missing oracle, and free labels. “Will a retry pass?” (a 20-180-minute wait, labelled by the retry itself) and “which failure class?” (about 780 Koji failures a day, labelled by the next fix diff) both qualify. Ruling out a question works the same way: the solver answers “will this resolve?” exactly, so a 95%-accurate model would only add about 9 wrong answers across 187 package rows.
Log Detective and rpmeta are both deployed in Fedora. Which one is Jev-like, and why does it matter?
rpmeta. It returns a typed prediction from a cheap gradient-boosted model trained on 705,766 build records, and its output can be scored exactly. Log Detective generates free-text explanations, which can’t be scored automatically and have no published accuracy.
Fedora’s AI policy and Gentoo’s ban look opposite. Why can a triage model fit under both?
Both target content in contributions. A model that classifies logs, retries jobs or flags spam contributes no content. Fedora explicitly allows “objective technical validation… or spam filtering”, as long as AI isn’t the sole or final arbiter. Generated patches are where the policies bite.
Why is “this PR was merged” a risky label for “safe to auto-merge?”
It’s a proxy, and a skewed one. Merged isn’t the same as correct, and bot PRs merge 92-99% of the time, so there are very few negatives to learn from. Add later reverts, CI regressions and rollbacks as negative signals.
Go deeper
Section titled “Go deeper”- Fedora Magazine: Log Detective in Packit: how Fedora wired an LLM failure explainer into its PR CI, and its own caveats.
- fedora-copr/rpmeta: the existing typed, non-generative model inside Fedora’s build system.
- Fedora AI-assisted contributions policy: the clearest statement of what automated validation may do.
- LWN: Machine learning and stable kernels: the 2018 precedent for a typed decision model in kernel maintenance.
- Kapoor & Narayanan: Leakage and the reproducibility crisis: the leakage traps that bite outcome-labelled data.
- Debian vote 2026/002: the options, the tallies and the wording Debian settled on.