Issue and pull request classification
Assigns an issue or pull request to a project component and classifies it as a bug, feature, question, documentation change or duplicate.
Example
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
- readers 1
- plotting 0
- docs 0
The crash shows in a chart command but comes from reading the file, so the owning part of the project is readers.
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)
More examples
Request to silence progress outputanswer feature · confidence 0.564
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
- feature 0.564
- question 0.433
- duplicate_candidate 0.001
The user asks for a way to turn the progress output off, something the tool does not do yet, so it is a
featurerequest.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)
Wrong example in the docsanswer docs · confidence 0.961
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: 419 title: Quick start page uses a function that does not exist body: The quick start says to call tidepool.load_station(), but the library has tidepool.read_station() and that works fine. Only the page is wrong. labels: []
- Answer (JSON)
- value docs, confidence 0.961
- Top options
- docs 0.961
- bug 0.038
- duplicate_candidate 0.001
The library works and only the quick start page names the wrong function, so the kind is
docs.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": 419, "title": "Quick start page uses a function that does not exist", "body": "The quick start says to call tidepool.load_station(), but the library has tidepool.read_station() and that works fine. Only the page is wrong.", "labels": [], }) print(decision.value, decision.confidence)
Legend covering the colour bar, againanswer duplicate_candidate · confidence 0.896
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: 422 title: Colour scale hidden behind the legend on station maps body: When I draw a station map, the legend box sits on top of the colour scale so I can't read the values. labels: []
- Answer (JSON)
- value duplicate_candidate, confidence 0.896
- Top options
- duplicate_candidate 0.896
- bug 0.102
- docs 0.001
The legend covering the colour scale is the problem open issue 398 already reports, so it is a
duplicate_candidate.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": 422, "title": "Colour scale hidden behind the legend on station maps", "body": "When I draw a station map, the legend box sits on top of the colour scale so I can't read the values.", "labels": [], }) print(decision.value, decision.confidence)
Chart axis labels cut off, who owns itanswer plotting · confidence 0.997
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: 423 title: Y axis label cut off in tide charts body: Charts made with tidepool.plot.tide_chart() cut off the left half of the y axis label when the figure is narrow. The data itself is read correctly. 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 plotting, confidence 0.997
- Top options
- plotting 0.997
- readers 0.001
- cli 0.001
The data is read correctly and the chart cuts off its own label, so the owning part of the project is
plotting.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": 423, "title": "Y axis label cut off in tide charts", "body": "Charts made with tidepool.plot.tide_chart() cut off the left half of the y axis label when the figure is narrow. The data itself is read correctly.", "labels": [], }) print(decision.value, decision.confidence)
Use when
- You need to sort incoming issues or pull requests using a list of project components and their descriptions.
Avoid when
- You need to write a response or resolve the issue; this adapter only classifies and routes it.
Context and input
| Field | Kind | Description |
|---|---|---|
new_item | input | The new issue or pull request, an object with its type, number, title, body and any labels or changed files. |
project | context | The project in a few sentences, and its components, each with its owner team, what it owns and its code paths. |
open_issues | context | The project's open issues, one string each ("#number [Component] title: summary"). |
Functions
| Key | Interface | Instructions | Labels |
|---|---|---|---|
| kind | classify | What kind of issue or pull request is this? Apply the first rule that fits. duplicate_candidate: it reports the same problem or asks for the same thing as one of the listed open issues, even in different words (a similar topic with a different problem is not a duplicate). docs: only documentation needs to change (wrong, missing or unclear docs, README, examples or code comments) and the software itself works as intended. bug: the software does not work as intended or as documented (errors, crashes, wrong results); a pull request that fixes such a defect is a bug. feature: it asks for new behaviour or an improvement the software does not claim to have, even if the writer calls it a bug; a pull request that adds behaviour is a feature. question: it asks how to do something or what the expected behaviour is, and does not report a defect or ask for a change. | bug, docs, duplicate_candidate, feature, question |
| owner | route | Which component owns this issue or pull request? Choose the component whose code, configuration or documentation must change to resolve it, using the component descriptions and paths. Where the problem was noticed does not decide it: follow the error message, stack trace, file paths or the cause the report describes. For a pull request, the component whose files it changes. For a question, the component whose behaviour is asked about. For a report that repeats one of the listed open issues, the component that owns the issue it repeats. | from the caller |
How it was measured
Test accuracy: the share of test rows whose top answer was right.
- 99.0% on the in-house test (2,000 rows). in-house: same generator as the training data
- 98.9% on a second in-house test of unseen cases. in-house: same generator as the training data
When confident
From the calibration set: at or above the threshold confidence, how often the answer is right, and how often the adapter is that confident. Below it, escalate.
| Function | Right when confident | Confident on | Threshold | Calibration rows |
|---|---|---|---|---|
| kind | 99.1% | 100.0% | 0.56 | 1,020 |
| owner | 97.9% | 100.0% | 0.43 | 980 |
Caveats
- Training and test rows were kept only where a blind LLM check agreed with the label, so these scores are probably inflated.
Base: Jeff v1.4. Adapter trained: 25 October 2026.
Base
jeff-base v1.4
Call it
jeff.engineering.issue-route.kind, with placeholders for its input and context.
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": "<project>", "open_issues": "<open_issues>", }) decision = decide("<new_item>") print(decision.value, decision.confidence)
Download
Weights: mstrasser/jeff-adapter-issue-route (v1.4)
Licence: Apache-2.0