---
{
  "n": 17,
  "title": "The test cull - what one generated run covers and what stays",
  "abstract": "",
  "refs": [],
  "seen": [
    "agent"
  ],
  "data": {
    "status": "final"
  },
  "created": 1789957020.5346482,
  "updated": 1789960847.868257,
  "deleted": 0.0,
  "completed": 1789960847.868254,
  "outcome": "final",
  "type": "doc"
}
---
111 files, 267 tests, 8608 lines today. The shape after: one generated run over every resource and every action, one gate run over every provider, and at most one test file per feature, beside feature.py and bounded. This doc indexes every file and says keep, fold or go.

## The shape it is going to
Two generated runs carry the CRUD surface and the gate.

tests/test_every_action.py loops over every registered resource type and every public action on its controller. Arguments are made from the signature, and an action passes if it does its work or refuses in words; anything else is a defect. A second check proves every one of those actions is reachable as a journal command, which is the rule that a public method on a controller becomes one. It found one real class of breakage on its first run.

tests/test_the_gate.py loops over every provider and proves a write is refused until work is open, a read is not, and the refusal comes back in each harness's own shape. It was already written that way.

Beside those, a feature is allowed exactly one test file, and it covers only that feature's own side effects - what the generated run cannot see. It lives in the feature's own folder beside feature.py, and it does not grow without end.

## Goes - the generated run already covers it
tests/test_resources.py, 148 lines, 7 tests. The hand-written lifecycle over every type: create, read back, title and abstract limits, section, link, comment, complete, reopen, delete, restore, force delete. Every line of it is a case the generated run walks. What it has that the run does not is the limits themselves - a title past 80 characters, an abstract past its own - and those belong with the field declarations in test_fields.py.

tests/test_reactions.py, tests/test_questions.py, tests/test_messages.py, tests/test_docs.py, tests/test_todo_waits.py, tests/test_environment_words.py. Per-type behaviour written before the run existed. Each is either a case the run walks or a case that belongs in that type's feature file.

tests/test_statusline.py at the top level, beside tests/features/statusline/ which holds seven more files and 712 lines. The statusline is one feature; it gets one file.

tests/features/*/ with more than one file - agents 4, messages 3, plugins 9, statusline 7, work 3, and the pairs under attachments, became, questions, rules, skills, start and tabfocus. These fold into one file per feature. Folding is not keeping: what the generated run walks goes, and what is left is the feature's own side effects.
