The best bug report you ever received was written in a language you do not read.
Reeve keeps a repository's recurring work moving — sorting, matching, answering —
in whatever language it arrived in, inside an authority you wrote down and it cannot exceed.
Reeve labels, translates, deduplicates, and answers issues from inside your own warrant file — not a chatbot, not a hosted service, not a workflow engine.
Quick start · What it refuses to do · North star · Documentation
Important
Reeve is being assembled, not announced. It is on a 0.x line: five
duties ship, dogfooded on this repository as they land — duplicate and
respond in report-only mode, writing verdicts to job summaries and touching
nothing — and the rest of the roadmap is
still open. 1.0 is the
release where all of it is done — until then an input can still be renamed on
a minor, and the release notes will say so.
A project's contributors do not all share a language. Its automation acts as though they do.
Every serious tool in this category is English-first, and it shows in the place it matters least visibly: not in translation, but in decisions. Sorting is worse. Duplicate detection simply fails — two reports of the same crash, one in Vietnamese and one in English, never meet. The person who wrote the most useful report you got this month gets a slower, worse answer than someone who wrote a vaguer one in English.
Reeve treats language as something the core knows and every duty consumes, not as one feature bolted on beside the others. That is the whole thesis, and the north star is where it is argued properly.
name: Reeve
on:
issues:
types: [opened, reopened, edited]
permissions:
contents: read
issues: write
jobs:
triage:
runs-on: ubuntu-latest
steps:
- uses: ecoma-io/reeve/triage@v0.1
with:
api-key: ${{ secrets.OPENAI_API_KEY }}
models: gpt-5-mini
translate:
runs-on: ubuntu-latest
steps:
- uses: ecoma-io/reeve/translate@v0.1
with:
api-key: ${{ secrets.OPENAI_API_KEY }}
models: gpt-5-mini
languages: en, viOne repository, one version line, one core — and each duty keeps its own inputs, so nothing you write is meaningless to the thing you are configuring.
Before granting a capability for real, check what your warrant would actually
do with uses: ecoma-io/reeve@v0.1 and doctor: true — it reads your file
and this repository's labels and reports what a duty would find, writing
nothing. See Doctor.
A reeve was the officer who ran an estate on the owner's behalf: the daily work, done without being asked each time, inside an authority the owner had granted and could withdraw at any moment. The owner stayed the owner.
That is the whole product. Everything below follows from it.
The list is short, it is enforced in code, and it is the most important section on this page.
| Act outside its warrant | What Reeve may do is a file in your repository, or its narrowest built-in default where you wrote no file at all. A label your taxonomy does not name is never applied; a capability you did not grant is never used. Checked against the file — never against the model's own claim about what it was allowed to do. |
| Rewrite what a person wrote | Titles and bodies belong to whoever wrote them. Machine output sits beside human text, marked, never in place of it. |
| Overrule a maintainer | It never removes a label a person applied, never reassigns, never reopens. It proposes; you decide. (The one bounded carve-out: lifecycle's clock-hand exception takes back a label its own actor applied, and only that.) |
| Close, lock, or delete | Off by default and staying that way. Everything past the cheapest reversible action is opt-in, one at a time. |
| Write code | Reeve reads and decides. It does not author diffs, run your tests, or fix your bugs. That is a different tool, and a crowded one. |
| Guess when it cannot read | Model output that does not parse yields no result and a loud failure — not a best-effort read of the parts that looked fine. The shapes that fail to parse are the ones an injection produced. |
| Pretend it worked | A run that cannot do its job fails red. It never reports an empty result in green to mean something went wrong. |
| Hold your data | No account, no dashboard, no hosted state. Taxonomy, corrections, configuration and markers are plain files in your repository — reviewed in a pull request, and deleted with rm. |
A duty is one job Reeve does, and none of them is switched on by a mode — what runs is exactly as much as you wrote down, one rung of the ladder at a time. Every duty shares a core — the provider client and its fallback, the language layer, several drafts filtered by deterministic scoring, the sanitiser, the allowlist, the state kept as files in your repository — and differs only in what it decides:
| Duty | What it does | Reference |
|---|---|---|
triage |
Sorts a backlog against the taxonomy you wrote — or, at the bottom rung, against the labels your repository already has. | Reference |
translate |
Puts every issue and pull request in every language your project reads — in the thread's own body, marked as the version that counts. | Reference |
duplicate |
Finds the thread that already reported this — across the language it was reported in. Top rung: opt-in, never on by accident. | Reference |
respond |
Gives a stranger a first, useful reply in the language they wrote to you in, grounded in what the project already knows. Top rung: granted nothing until a warrant names it. | Reference |
lifecycle |
Runs your own staleness policy — reminders, un-staling, and a final close as not planned — from timestamps and labels alone. No model is ever called. | Reference |
What comes after them is decided by one test, and it is a strict one: the work has to recur, be uniformly expensive today, already be work a maintainer stopped doing, and be harder on a project whose contributors do not share a language. Doctrine D10 rejects most feature requests, on purpose.
Reeve is arranged so the expensive step runs last and least: code decides the easy majority for nothing, a cheap model screens what survives that, and only the minority that was always worth a careful read reaches the model you chose.
| Tier | Decides | Costs |
|---|---|---|
| Code | Empty bodies, unfilled templates, obvious spam, exact repeats, a thread Reeve already handled | Nothing |
| A cheap model | Is this worth a careful read — spam, off-topic, out of scope | Very little |
| The model you chose | The actual verdict, on what survived | The real bill |
Providers serving OpenAI-compatible models with no key at all are a supported
configuration, not a tolerated one: point base-url at one and give Reeve
several models. Full breakdown, including a worked estimate and how to measure
it instead of estimating it: Cost.
docs/ is the full index, organized by who's reading. Start here:
| If you are… | Start at |
|---|---|
| New to Reeve | Getting started |
| Deciding whether to adopt it | The authority model |
| Running it day to day | Guides |
| Reviewing it for security | Threat model |
| Changing the code | Development |

Reeve is developed at github.com/ecoma-io/reeve.
