Getting started
Two commands to install, one to find out whether the change you just made took something away.
Install
pip install yieldpoint # zero runtime dependencies
pipx install yieldpoint # isolated CLI
uv tool install yieldpoint # same, via uv
Python 3.10 or newer, and nothing else.
Try it without installing anything
uvx yieldpoint review
Run that in any repository with uncommitted work. It reads your diff from git, including unstaged files, and tells you whether anything you changed weakens what the tests verify.
Set it up properly
yieldpoint init
init writes three files and backs up anything it touches:
| File | What it does |
|---|---|
.yieldpoint.json | The rules. Committed, so the team shares one definition. |
.mcp.json | Registers the MCP server, so your agent can ask what a rule means. |
.claude/settings.json | Registers the hook, which is the part that actually enforces. |
Restart your editor after init
Hooks and MCP servers are read when a session starts, so nothing you install is
active in the session you install it from — and that looks exactly like it
working: no output, no error, every edit allowed. yieldpoint doctor
reports whether the hook has actually seen an edit, which is the only way to tell
those two states apart. yieldpoint review works immediately, with no
restart.
It starts advisory
The hook reports and never blocks. Run yieldpoint init --enforce once you
are happy with what it reports.
Reading a verdict
$ yieldpoint review
REPAIR 1 finding(s)
tests/test_invoice.py:14 in test_total [assertion_monotonicity]
Assertion on invoice.total was weakened: eq -> non_null.
fix: Re-assert invoice.total at eq strength, or fix the code under test so the
original assertion passes. Restore `assert invoice.total == 42`.
Every verdict carries a prescription naming exactly what to restore, so a rejected change does not have to be diagnosed by guessing.
Exit codes
| Code | Meaning |
|---|---|
0 | Checked, and nothing was weakened. |
1 | Findings. Something was taken away. |
2 | The tool itself failed. |
3 | Nothing could be analysed. Not a pass. |