Issue Assistant is a deterministic GitHub issue triage engine for maintainers who need consistent, explainable signals about issue quality, duplicates, actionability, and maintainer load.
It is designed to reduce triage burden without taking control away from humans. It is not an auto-closing bot, not an LLM-based subjective classifier, and not hidden automation. Every output is a Markdown or JSON artifact that can be inspected, reviewed, and ignored.
All generated artifacts are written to .issue-assistant/ by default. Nothing is hidden, guessed, or implicit.
Use this path to understand the project in about five minutes:
- Problem solved: Issue Assistant gives maintainers deterministic, explainable triage signals for noisy, incomplete, duplicate, or high-load GitHub issues.
- Install the CLI:
pip install issue-assistant - Run locally:
issue-assistant analyze --github-token "$GITHUB_TOKEN" --repo owner/name --output-dir .issue-assistant --governance-mode dry-run - Run safely:
--governance-mode dry-runwrites artifacts only and does not comment, label, or close issues. - Artifacts: Outputs are written under
.issue-assistant/, including summary Markdown, JSON data, and per-issue files under.issue-assistant/issues/<issue_number>/. - GitHub Action:
action.ymlis a thin wrapper around the CLI. It installsissue-assistant, runsissue-assistant analyze, then uploads, commits, or skips artifacts based on thepublishinput. - Rules and explainability: Rule-based signals live in src/issue_assistant/phases/. Artifact writing is in src/issue_assistant/artifacts.py, and governance-aware comment decisions are in src/issue_assistant/automation.py.
- Governance modes:
dry-runis artifact-only,strictallows limited transparent comments when configured, andaggressivecan include label suggestions while still preserving maintainer control. - Tests and checks: The repo includes
pytesttests under tests/ and apytest.iniconfiguration.
Issue Assistant demonstrates:
- deterministic CLI product design
- GitHub issue triage automation built around maintainer review
- explainable rule-based analysis instead of opaque scoring
- Markdown and JSON artifact generation for auditability
- GitHub Action integration through a composite action wrapper
- governance-aware automation modes with dry-run as the safe default
- duplicate, actionability, quality, and maintainer-load signals where implemented
- human-first automation boundaries that support decisions without making final decisions
- open-source maintainer workflow awareness, including issue-triggered and scheduled runs
Maintainers spend a disproportionate amount of time triaging issues that are:
- missing reproduction steps, logs, or environment details
- duplicates that fragment discussion
- unclear about expected vs. actual behavior
- noisy or low-signal
Issue Assistant provides a deterministic baseline for triage so humans can make faster, more consistent decisions without surrendering control.
Issue Assistant is intentionally conservative:
- Deterministic only: no LLMs, no probabilistic output
- Explainable by construction: every outcome maps to rules and evidence
- Governance-aware: safe defaults, no surprise side effects
- Human-first: maintainers always make the final call
If a signal cannot be explained clearly, it does not exist.
Requires Python 3.10+.
pip install issue-assistantissue-assistant analyze \
--github-token "$GITHUB_TOKEN" \
--repo owner/name \
--output-dir .issue-assistant \
--governance-mode dry-runThis performs a full analysis and writes artifacts locally without modifying issues.
You can also analyze an exported Issues API-style payload:
issue-assistant analyze \
--issues-file issues.json \
--output-dir .issue-assistant \
--governance-mode dry-runIssue Assistant is available as a GitHub Action. Pin to an existing tag or commit SHA:
uses: siggmond/issue-assistant@v0.2.1The Action is a thin wrapper around the CLI. It installs the issue-assistant package, runs issue-assistant analyze, and publishes artifacts according to the publish input.
Typical triggers include:
- issue opened, edited, or reopened
- scheduled runs for repo-wide review or weekly digest artifacts
Artifacts can be uploaded, committed, or skipped depending on your workflow.
Dry-run is the safest default and should be the first mode reviewers try.
| Mode | Comments | Label suggestions | Intended use |
|---|---|---|---|
| dry-run | never | never | analysis only; writes artifacts without issue side effects |
| strict | limited, if --auto-comment is enabled |
no | request missing information or flag likely duplicates transparently |
| aggressive | yes, if --auto-comment is enabled |
suggestions only | higher-throughput triage support without auto-closing |
Hard constraints:
- no issue auto-close
- no guessed fixes
- no invisible scoring
- no hidden side effects
- comments and label suggestions must be traceable to deterministic rules
- maintainer decisions are never overridden
A typical run writes artifacts under .issue-assistant/, including:
ISSUE_SUMMARY.mdandissues.jsonDUPLICATES.mdandDUPLICATE_GROUPS.mdTRIAGE.mdMAINTAINER_ACTIONS.mdMAINTAINER_COST.mdMAINTAINER_LOAD.mdandmaintainer_load.jsonEXPLAINABILITY.mdandexplainability.json- per-issue playbooks, contributor guides, label suggestions, quality breakdowns, and explainability JSON under
.issue-assistant/issues/<issue_number>/
Example Markdown outputs are included under docs/. Existing screenshots live under docs/screenshots/.
Issue Assistant is deterministic and conservative by design.
- It does not auto-close issues.
- It does not guess fixes.
- It does not replace maintainer judgment.
- Duplicate detection and actionability signals are rule-based and best-effort.
- Repositories with unusual issue templates, support flows, or domain-specific formats may need configuration or manual review.
- Generated artifacts support human decisions; they are not final decisions.
Issue Assistant is not a good fit if you want:
- fully automated triage or auto-closing
- subjective or sentiment-based analysis
- invisible automation
- zero repository artifacts
Explainability is a core invariant.
If the tool cannot explain why it produced an output, that output should not exist.
Issues, suggestions, and pull requests are welcome. This project is intentionally scoped around explainable maintainer support, so changes should preserve deterministic behavior and human review boundaries.