Skip to content

Open-source adapters

Engineering

The engineering adapters help a software project keep up with its own automation: why a build-and-test run failed, which part of the project owns a new issue or pull request, and what type it is. They read what a maintainer would read (the log, the change, the run history, the issue text) and give an answer a bot can act on, such as re-running a flaky test or labelling and assigning an issue.

Each example below uses an input written for this page and shows the answer returned by the live API. To run one yourself, set JEFF_API_KEY as in the Quick start.

Build failure triage

Build failure triage reads a failed automated build-and-test run (its log, the code change and the run history) and says what kind of failure it is: a real regression, a flaky test, infrastructure, a dependency change, a test that needs updating, and so on. Here a change meant to speed up a CSV reader fails a test that passes on the main branch:

Context

project
tidepool, an open-source Python library for reading and writing tide-gauge data files.
ci_run
job: tests (python 3.12) trigger: pull request 412 commit: 9f3c2e1 date: 2 November 2026
change
title: Speed up the CSV reader description: Reads rows in blocks of 4,096 instead of one at a time. No behaviour change intended.
ci_facts
attempts_on_this_commit: 2, both failed the same way same_test_on_main: passed in each of the last 30 runs other_jobs_in_this_run: lint passed; docs passed dependency_versions: unchanged since the last passing run duration: 3 min 40 s (usual 3 min 30 s)

Input

tests/test_csv.py::test_reads_last_row FAILED E AssertionError: expected 1,000 rows, got 904 E assert 904 == 1000 ========== 1 failed, 213 passed in 41.2s ==========

Answer (JSON)
value real_regression, confidence 0.996
Top options
  1. real_regression 0.996
  2. dependency_change 0.001
  3. environment_or_infra 0.001

Open in playground

import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client:     decide = client.function("jeff.engineering.ci-failure.failure", context={        "project": "tidepool, an open-source Python library for reading and writing tide-gauge data files.",        "ci_run": {            "job": "tests (python 3.12)",            "trigger": "pull request 412",            "commit": "9f3c2e1",            "date": "2 November 2026",        },        "change": {            "title": "Speed up the CSV reader",            "description": "Reads rows in blocks of 4,096 instead of one at a time. No behaviour change intended.",        },        "ci_facts": {            "attempts_on_this_commit": "2, both failed the same way",            "same_test_on_main": "passed in each of the last 30 runs",            "other_jobs_in_this_run": "lint passed; docs passed",            "dependency_versions": "unchanged since the last passing run",            "duration": "3 min 40 s (usual 3 min 30 s)",        },    })     decision = decide("tests/test_csv.py::test_reads_last_row FAILED\nE   AssertionError: expected 1,000 rows, got 904\nE   assert 904 == 1000\n========== 1 failed, 213 passed in 41.2s ==========")     print(decision.value, decision.confidence)

real_regression means the change itself broke the code: the test fails the same way twice on this commit, passes on the main branch, and nothing else changed. Send it back to the author rather than re-running it.

Issue and pull request classification

Issue and pull request classification chooses the component responsible for a new issue or pull request from a menu, and identifies its type: bug, feature, question, docs or duplicate. Those are two functions. The first picks the owner, from the components you pass as labels:

Context

project
tidepool is an open-source Python library for reading and writing tide-gauge data files. Components: - readers (team io): file readers for CSV, NetCDF and the station formats; paths tidepool/readers/ - plotting (team viz): charts and maps; paths tidepool/plot/ - cli (team tools): the tidepool command; paths tidepool/cli/ - docs (team docs): the documentation site; paths docs/
open_issues
- #398 [plotting] Map legend overlaps the colour bar - #405 [cli] Add a --quiet flag

Input

type: issue number: 417 title: tidepool plot crashes on a NetCDF file with missing timestamps body: Running `tidepool plot station.nc` stops with "KeyError: 'time'" in tidepool/readers/netcdf.py line 88, before any chart appears. The same file opens fine in other tools. labels: []

Labels (the options)

readers
File readers for CSV, NetCDF and the station formats (tidepool/readers/)
plotting
Charts and maps (tidepool/plot/)
cli
The tidepool command (tidepool/cli/)
docs
The documentation site (docs/)
Answer (JSON)
value readers, confidence 1
Top options
  1. readers 1
  2. plotting 0
  3. docs 0

Open in playground

import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client:     decide = client.function("jeff.engineering.issue-route.owner", context={        "project": "tidepool is an open-source Python library for reading and writing tide-gauge data files. Components:\n- readers (team io): file readers for CSV, NetCDF and the station formats; paths tidepool/readers/\n- plotting (team viz): charts and maps; paths tidepool/plot/\n- cli (team tools): the tidepool command; paths tidepool/cli/\n- docs (team docs): the documentation site; paths docs/",        "open_issues": [            "#398 [plotting] Map legend overlaps the colour bar",            "#405 [cli] Add a --quiet flag",        ],    }, labels={        "readers": "File readers for CSV, NetCDF and the station formats (tidepool/readers/)",        "plotting": "Charts and maps (tidepool/plot/)",        "cli": "The tidepool command (tidepool/cli/)",        "docs": "The documentation site (docs/)",    })     decision = decide({        "type": "issue",        "number": 417,        "title": "tidepool plot crashes on a NetCDF file with missing timestamps",        "body": "Running `tidepool plot station.nc` stops with \"KeyError: 'time'\" in tidepool/readers/netcdf.py line 88, before any chart appears. The same file opens fine in other tools.",        "labels": [],    })     print(decision.value, decision.confidence)

readers is the owning component: the crash shows in a chart command, but the error is raised in the NetCDF reader.

The second identifies the type of a different issue: a request to silence progress output:

Context

project
tidepool is an open-source Python library for reading and writing tide-gauge data files. Components: - readers (team io): file readers for CSV, NetCDF and the station formats; paths tidepool/readers/ - plotting (team viz): charts and maps; paths tidepool/plot/ - cli (team tools): the tidepool command; paths tidepool/cli/ - docs (team docs): the documentation site; paths docs/
open_issues
- #398 [plotting] Map legend overlaps the colour bar - #405 [cli] Add a --quiet flag

Input

type: issue number: 418 title: Option to silence progress output body: When I run tidepool in a cron job it prints progress bars into my logs. Could there be a way to turn the output off? labels: []

Answer (JSON)
value feature, confidence 0.564
Top options
  1. feature 0.564
  2. question 0.433
  3. duplicate_candidate 0.001

Open in playground

import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client:     decide = client.function("jeff.engineering.issue-route.kind", context={        "project": "tidepool is an open-source Python library for reading and writing tide-gauge data files. Components:\n- readers (team io): file readers for CSV, NetCDF and the station formats; paths tidepool/readers/\n- plotting (team viz): charts and maps; paths tidepool/plot/\n- cli (team tools): the tidepool command; paths tidepool/cli/\n- docs (team docs): the documentation site; paths docs/",        "open_issues": [            "#398 [plotting] Map legend overlaps the colour bar",            "#405 [cli] Add a --quiet flag",        ],    })     decision = decide({        "type": "issue",        "number": 418,        "title": "Option to silence progress output",        "body": "When I run tidepool in a cron job it prints progress bars into my logs. Could there be a way to turn the output off?",        "labels": [],    })     print(decision.value, decision.confidence)

feature is right (the issue asks for a new option), but its confidence is only 0.564. Low confidence means the function is uncertain: across many answers assigned a confidence of about 0.56, more than four in ten are wrong. Here the request sits close to an open issue asking for a --quiet flag, so it could also be read as a duplicate. Do not label the issue on such an answer alone: check abstained (it is true when the confidence is below the threshold the function was calibrated with), and leave uncertain cases for a maintainer, or let Jeff pass them on with an on_low_confidence policy. See Calibrated confidence and Escalation.