Every key¶
Each key of the three files, its type, its default and what check makes sure of. A key that says required has no default. Besides, check makes sure that every value has the type of its key, and fails on every key that these tables don't have, naming the key that was probably meant, such as form_options for form_option.
labels.toml¶
Each [[label]] of .github/labels.toml is a label of the repository:
Each key of labels.toml
| Key | Type | Default | What it does | What check makes sure of |
|---|---|---|---|---|
name |
string | required | The name of the label | 1 to 50 characters, as GitHub allows, and no other label has it, in any case: GitHub takes bug and Bug for one label |
color |
string | required | Its colour, six hexadecimal digits without # |
Six digits, such as d73a4a |
description |
string | required | What the label means; GitHub shows it with the label | 1 to 100 characters |
group |
string | required | type, area, topic, priority, lifecycle, decision, release or dependabot. The AI chooses one label of the group type, the kind of the issue, any of area and topic, and, where the repository has labels of the group priority, the priority of an issue that has none |
One of these groups, at least one label of the group type, and no priority named none, which the AI answers when it can't judge |
form_options |
list of strings | [] |
The answers of the area field of the issue forms that choose the label; of a dropdown with multiple: true, each chosen answer adds its label |
Only kinds, areas and topics have them; each is an option of a form and belongs to one label alone |
ask |
boolean | true |
For a kind: whether the AI may ask its reporters for information | It is true or false |
owners |
list of strings | [] |
For an area: the GitHub logins that a new issue of the area is assigned to, when nobody is assigned to it. GitHub notifies them; the assistant mentions nobody | Only areas have them; each is a login, without @, and there are at most 10, as many as GitHub assigns to one issue. The Labels workflow warns of a login that can't be assigned |
issue_type |
string | "" |
For a kind: the issue type of the organization that issues of the kind get, such as Bug |
Only kinds have one, without spaces at its start or end. The Labels workflow warns of a type that the repository doesn't have |
The group lifecycle needs the seven labels that the assistant sets: needs-triage, needs-info, stale, possible-duplicate, duplicate, invalid and fixed-in-next-release, the last one only while close_with_release is true.
config.toml¶
.github/issue-assistant/config.toml is optional; without it, every key has its default.
| Key | Type | Default | What it does | What check makes sure of |
|---|---|---|---|---|
[engine] name |
string | "claude" |
The AI engine that writes the analysis, as Engines compares them | An engine of the assistant: claude, codex, copilot or gemini |
[engine] model |
string | "" |
The model; empty for the engine's default: claude-opus-5-5 for Claude, gpt-6.1-sol for Codex, auto for Gemini and auto for Copilot, with which the CLI chooses |
A model name: a letter or a digit, then letters, digits and ._:@/[]- |
[engine] light_model |
string | "" |
The model of the replies to one comment, which only judge it, yes or no: whether a maintainer's comment waits for the reporter, and whether a problem persists after the release; empty for model |
A model name, as for model |
[engine] effort |
string | "" |
How much the model thinks, for the models that take it; empty for the model's default | low, medium, high, xhigh or max, and none for Gemini, which takes no effort |
[engine] max_turns |
integer | 40 |
The most turns of a first analysis and of a maintainer's question; a follow-up gets half of them, and a reply to one comment a tenth, each rounded up and at least 4 (or max_turns when it is fewer), which a reply needs. Claude and Gemini stop at them; Codex and Copilot only at the time of the job |
A whole number, 1 to 200 |
[engine] max_budget_usd |
number | 1.00 |
The most dollars that one run of the engine may cost, as the engine counts them at the prices of its API; once a run has spent this sum it stops without an answer, so a run can go past it by the cost of its last turn, and the summary of the job says so. Only Claude counts dollars; the others stop at the time of the job | A number, more than 0 and at most 100 |
[engine] max_per_day |
integer | 20 |
The most AI runs that people who don't maintain the repository start in 24 hours: analyses of new issues, follow-ups and replies after a release; 0 lets only maintainers start the AI, by hand |
A whole number, 0 or more |
[engine] max_per_author_per_day |
integer | 3 |
The most analyses of one reporter's new issues in 24 hours | A whole number, 0 or more |
[engine] release_replies |
integer | 2 |
How many comments of the reporter the AI reads after each release that closed their issue | A whole number, 0 or more |
[context] max_issues |
integer | 1000 |
How many closed issues an analysis and a follow-up read besides every open one: those that changed last; see what the AI reads | A whole number, 0 or more |
[context] max_discussions |
integer | 1000 |
How many discussions an analysis and a follow-up read: those that changed last; 0 reads none |
A whole number, 0 or more |
[context] max_analyzed |
integer | 30 |
How many of the issues analyzed last a first analysis learns from: the labels that the maintainers removed or added, the duplicates that someone objected to and the analyses that a maintainer gave a 👎; 0 learns from none |
A whole number, 0 or more |
[related] repositories |
list of strings | [] |
Public repositories that share users and topics with this one, as owner/name: a first analysis also searches their issues, links those that help, and says when an issue may belong in one of them, which a maintainer then transfers by hand; see related repositories |
Each is a repository, owner/name, other than this one, and named once; at most 5 |
[discussions] answer_categories |
list of strings | [] |
The categories of GitHub Discussions, such as Q&A, whose new discussions get a first answer of the AI, in any case, once .github/workflows/discussion-assistant.yml is there, which install writes then; the starter names Q&A, and [] answers no discussion |
Each names a category, once in any case; with any, the workflow of the discussions is there and equals its template |
[maintainers] language |
string | "en" |
The language that the maintainers read: an analysis, a follow-up or a first answer in Discussions that the AI writes in another language, such as Japanese, folds a summary for the maintainers in this one below its text | The code of a catalog in locales/, such as de or en; check lists the known ones |
[links] hosts |
list of strings | [] |
The hosts that links in the comments may lead to, besides the repository itself | Each is a host name, such as docs.example.com |
[forms] area_field |
string | "Area" |
The dropdown of the issue forms whose answer chooses an area label | Each of its options belongs to one label, or to unmapped_options |
[forms] unmapped_options |
list of strings | ["Other"] |
Answers of that dropdown that choose no label | A list of strings |
[transparency] files |
list of strings | ["SUPPORT.md"] |
The files that tell reporters which AI reads their issue; the footer of every analysis and follow-up links the first, at its heading What happens with your issue when it has one | Each exists and names the engine and its vendor: Claude and Anthropic, Codex and OpenAI, Gemini and Google, or Copilot and GitHub |
[releases] close_with_release |
boolean | true |
Whether a fixed issue stays open until a release ships the fix; false for a repository without releases |
It is true or false |
[lifecycle] remind_after_days |
integer | 15 |
The days after the last question without an answer until the reminder, which names the day the issue closes | 1 to 3650, and the descriptions of needs-info and stale in labels.toml name no other days |
[lifecycle] close_after_days |
integer | 30 |
The days after the last question until an issue without an answer closes as not planned, on the day that the reminder named | More than remind_after_days, up to 3650 |
[lifecycle] duplicate_grace_days |
integer | 3 |
The days after the notice of a sure duplicate until it closes, unless someone objects | 1 to 3650, and the description of possible-duplicate names no other days |
[lifecycle] reopen_after_release_days |
integer | 30 |
The days after a release closed an issue in which a comment of its reporter that the problem persists reopens it | 1 to 3650 |
[lifecycle] max_follow_ups |
integer | 2 |
How often the AI follows up on the reporter's answers to its questions; 0 for never |
0 to 3650 |
[lifecycle] exempt_labels |
list of strings | ["pinned", "security"] |
Issues with one of these labels, in any case, are never reminded, closed as unanswered or as a duplicate, or locked | A list of strings |
[lifecycle] exempt_assignees |
boolean | false |
Whether issues assigned to someone are exempt as well | It is true or false |
[lifecycle] exempt_upvotes |
integer | 0 |
Issues with at least this many 👍 are exempt as well; 0 exempts none for their 👍 |
0 to 3650 |
[lifecycle] lock_closed_after_days |
integer | 0 |
The sweep locks issues closed for more than this many days as resolved, with one line that points to a new issue, at most 25 in a sweep; 0 locks none |
0, or at least reopen_after_release_days and up to 3650 |
[digest] issue |
boolean | false |
Whether the morning sweep also keeps its digest in one issue, which it opens and then edits without notifying anyone | It is true or false |
[digest] title |
string | "Triage digest" |
The title of that issue; the sweep sets it anew when it differs | One line of 1 to 256 characters |
findings.toml¶
Each [[accept]] of .github/findings.toml accepts the alerts of one rule of code scanning:
Each key of findings.toml
| Key | Type | Default | What it does | What check makes sure of |
|---|---|---|---|---|
tool |
string | required | The tool, as code scanning names it, in any case | It isn't empty |
rule |
string | required | The rule, such as py/unused-import |
It isn't empty |
reason |
string | required | The reason that GitHub records for the dismissal | false positive, won't fix or used in tests |
comment |
string | required | Why, in words, shown with the dismissed alert | 1 to 200 characters |
path |
string | "" |
Only alerts in this file, or in the files of this folder, such as vendor for vendor/board.js but not vendored/board.js; empty for every file |
Nothing; a key that the table doesn't have, such as paths, stops the findings command too, since the acceptance would cover every file |