python-vibe

ask, test, fix, add

GitHub

Demo

A single typed session on this same tree: Live demo.

Every case below was run against demo/orders, a small project with a few deliberate problems in it, using llama3.1:8b through Ollama on one laptop. Each case started from a fresh copy, so no case could see another one’s changes.

Reproduce it:

ollama pull llama3.1:8b
python scripts/run/demo.py --markdown docs/demo.md

Two columns matter. Agent says is whether it reported that it had finished. Checked is a separate test run against the files afterwards. The two do not always agree. In one run the bug was fixed correctly, and the report described writing a test that was never written.

The model does not give the same answer twice. Rebuilding this page changes which cases pass. write-tests and rename have each both passed and failed on different runs, while bugfix, dry-run and vague have not yet failed. Read the table as one run, not as a score.

Four results do not depend on the model. The first two cases need no model at all. dry-run changes nothing, because every change is refused before it happens. vague stops and asks which file to work on. review reports without editing.

Summary

Case Task Agent says Checked Steps Files changed
brief Size up an unfamiliar repo no model needed none
layout Find out why a tree is hard to read no model needed none
question Ask what a function does yes not checked 1 none
bugfix Fix a bug no test covers yes passed 0 src/orders.py
add-feature Add a function and a test no (steps) passed 8 src/orders.py, tests/test_orders.py, pkg/orders_concern.py
write-tests Cover something that has no test no (steps) failed 8 none
rename Give an opaque name a real one yes passed 0 src/util.py
review Review one file without changing it no (steps) passed 8 none
dry-run See what it would do, change nothing no (steps) passed 8 none
vague Give it a task that says nothing no (question) passed 0 none
scoped Stay inside one folder on a bigger tree yes not checked 1 none

brief

Size up an unfamiliar repo. How big the project is, which files are in it, and which skills would apply. No model is called.

Mode: small  files=8  size=1.7 KB
Small project — explore, edit, and run on this laptop.
You can read every listed file. Prefer Action: patch for one-line fixes.
Questions: if you see # auto-read, Action: done. Else read one file, then done. Do not edit.
Files:
  README.md  491 B
  src/__init__.py  68 B
  src/orders.py  467 B
  src/render.py  193 B
  src/report.py  155 B
  src/util.py  67 B
  tests/__init__.py  0 B
  tests/test_orders.py  311 B

Skills available: add-feature, analyze-data, answer-question, ask-when-unclear, call-http, fix-smell, merge-pr, new-package, open-pr, read-issue, readable-layout, refactor-split, review-code, review-design, stay-scoped, write-algorithm, write-paths, write-script, write-tests

layout

Find out why a tree is hard to read. Two files importing each other, a folder with too many files in it, one file much larger than the rest, and missing tests.

layout: 1 finding(s), worst first.
  [cycle] render.py and report.py import each other

Next move (do only this one): Move what they share into a new module both import. Action: grep Query: def .*  Path: render.py

question

Ask what a function does. The function is found and read for the model before its first turn.

python-vibe run ./orders "what does apply_discount return?"

Skills loaded: answer-question

Actions: done

What it reported (done, 12.0s):

int

bugfix

Fix a bug no test covers. Naming a file in the task opens that file, and no other file may then be changed.

python-vibe run ./orders "find a real NameError in src/orders.py and fix it"

Actions:

Changed: src/orders.py

Files differing from the checked-in project:

Separate check: passed

What it reported (done, 0.1s):

bound unique NameError typo (subtotl → subtotal) in src/orders.py. Tests passed.

add-feature

Add a function and a test. The function is added, then a test for it, then the tests are run.

python-vibe run ./orders "add a function total_lines(prices) that counts the prices, and a unit test"

Skills loaded: add-feature, write-tests

Actions: patchpatchrunpatchediteditpatchpatch

Changed: src/orders.py, tests/test_orders.py, pkg/orders_concern.py

Files differing from the checked-in project:

Separate check: passed

What it reported (steps, 19.7s):

stopped after 8 steps

write-tests

Cover something that has no test. One test is added that sets up its inputs, calls the function, and checks the result. The import line is corrected automatically.

python-vibe run ./orders "write tests for apply_discount in src/orders.py"

Skills loaded: write-tests

Actions: locatepatchunparsedpatcheditpatchunparsedpatch

Refused by the harness:

Separate check: failed — AssertionError: no test names apply_discount

What it reported (steps, 7.7s):

stopped after 8 steps

rename

Give an opaque name a real one. The new name is written where the function is defined, not in the first file that mentions it.

python-vibe run ./orders "rename calc to multiply in src/util.py"

Skills loaded: fix-smell

Actions:

Changed: src/util.py

Files differing from the checked-in project:

Separate check: passed

What it reported (done, 0.1s):

renamed def calc → def multiply in src/util.py. Tests passed.

review

Review one file without changing it. A review reports what it finds. Any attempt to edit is refused.

python-vibe run ./orders "review src/orders.py for bugs"

Skills loaded: review-code

Actions: review-designreview-designdoneeditdoneeditdoneedit

Refused by the harness:

Separate check: passed

What it reported (steps, 15.9s):

stopped after 8 steps

dry-run

See what it would do, change nothing. With writes turned off, every change is refused before it happens.

python-vibe run ./orders "fix the NameError in src/orders.py"

Actions: patchdonepatchdonepatchdonepatchdone

Refused by the harness:

Separate check: passed

What it reported (steps, 18.5s):

stopped after 8 steps

vague

Give it a task that says nothing. The task names no file and no function, so it asks instead of guessing.

python-vibe run ./orders "clean this up"

Skills loaded: ask-when-unclear

Actions:

Separate check: passed

What it reported (question, 0.0s):

"clean this up" does not name a file or a function. Which file should I work on?
  1. src/orders.py
  2. tests/test_orders.py

scoped

Stay inside one folder on a bigger tree. Searching and listing stay inside the folder given by –scope.

python-vibe run ./orders "what does render_line return?"

Skills loaded: answer-question

Actions: done

What it reported (done, 6.0s):

"str"