Skip to content

What the platform keeps

Five records carry everything. Two describe what you test, two describe what happened, and one is where the two meet for a human decision.

Project — the boundary. An account has exactly one, and every read is scoped to it, so there is no cross-project query to get wrong. Two projects means two accounts.

Suite — a node of the tree, and the tree is a filesystem: a node’s kind is folder or suite, a folder holds folders and suites, a suite holds cases, and GET /v1/suites answers with the tree rather than a list. Each node has a position among its siblings, an optional description, and — when an import made it from a spec’s path — the file it stands for, so the next import finds it by the file even after a rename. A node that still holds something refuses to be deleted (409) instead of taking it with it. The rule and the ways round it are on Organizing cases.

Test case — the durable unit. It has a title, a body, and any number of external keys: the identifiers other tools already use for the same test — a Playwright test id, a JUnit classname, a Cairn scenario. Those keys are what let a report from a runner that has never heard of Plune find its case, which is what GET /v1/test-cases/resolve does, up to 500 at a time. A key is at most 1024 characters; a test name longer than that is shortened by the reporter before it becomes one — the head of the name plus a digest of the whole, so the same name gets the same key on every run — and the reporter says so. Beside them it carries a description and a precondition (the text — they move its version), a priority out of five, a position among the cases of its suite, and tags — which are not a field of their own but the @names read out of the title. The table the list filters by is an index derived from titles, never the other way round; The fields of a case has the rules.

Run — one execution of many tests, from any source: the Plune CLI, a JUnit report, a Cairn session. A run is opened, filled with results, and finished; its summary is five counters — passed, failed, broken, blocked, skipped — plus two numbers that matter more than they look:

  • unmapped — results that matched no case. Work arrived that nothing accounts for.
  • discovered — tests offered to the queue because this project has no case for them.

Result — one test’s outcome inside one run, with its duration, its error, and its link back to the case. GET /v1/results/{id}/history walks the same test across every run it appeared in, which is the question a flaky test is usually answering.

Review item — a queue entry waiting on a person. It is the subject of its own page, because it is the one record whose whole reason for existing is that the platform refuses to decide on its own.

Deleting a run is recursive over what the run produced, and stops there:

GoesStays
The runTest cases — including ones an approval created from it
Its resultsThe audit log of what happened
Queue entries it produced — proposals and disputes, whatever their stateSuites