PlumbAlpha

Proof that a story is done — verified, not asserted.

This is alpha software. It is pre-1.0 and published for trusted testers. Interfaces, the manifest format and the command line may all change between versions without notice, and there is no support commitment. Pin a version if you depend on one.

What it does

A green test suite tells you your tests pass. It does not tell you that the requirement you wrote down is actually implemented, or that the code you tested is reachable from the running system. Plumb checks the link that everyone assumes and nobody verifies.

A story counts as proven only when two things hold:

The second check is the one that finds things. Code no entry point reaches cannot prove a story however green its tests are, so a passing test over orphaned code stops reading as done. Status is derived from each run and never stored, so a proof that later breaks un-proves its story and nothing can go stale.

Optionally, and off by default, Plumb will also mutate the code a story's tests drove and report how many of those mutants the tests noticed — which is the only thing here that looks at whether your tests check anything, rather than merely running it.

Install

curl -fsSL https://plumb.64bitspace.com/install.sh | sh

One file, both language adapters inside it. No package index, no account, and nothing added to your project's dependencies. Then, in a project with a plumb.toml:

plumb board

Python and Java are supported today, by the same command and the same config file. Plumb itself needs Python 3.11+ somewhere on the machine — including when your project is Java, where nothing about your build changes. Ubuntu 22.04 and RHEL 9 ship older versions as python3; apt install python3.11 or dnf install python3.11 is the whole fix, and the installer tells you if it applies.

Getting started

In your project, run:

plumb init

It works out what it can from the layout — your packages, where compiled tests land, what the classpath file should be called — writes plumb.toml, and tells you what is left. It never overwrites: run it again on a half-configured project and it fills the gaps and says which files it kept.

Two things it cannot guess. Where your wired system begins:

# plumb.toml
entry_points = ["com.myapp.Api#handleRequest"]

Name the handful of places a real request enters. Without at least one, a story can still pass but nothing checks that its test reached the running system — which is the check worth having.

And which story a test proves. In Java, plumb init writes the annotation jar to .plumb/plumb-java.jar — depend on it so your citations compile (testImplementation files('.plumb/plumb-java.jar') in Gradle, a system-scoped dependency in Maven; plumb init prints both):

import plumb.Proves;

@Test
@Proves(value = "APP-1", depth = "wiring")
void ordersAreRouted() { ... }

The id is yours. Plumb keeps no catalog and never parses it, so APP-1, JIRA-4412 or a spreadsheet row all work.

Java needs its test classpath in a file, which your build tool already produces:

mvn dependency:build-classpath -Dmdep.outputFile=target/plumb-classpath.txt
plumb board

In Python it is @pytest.mark.proves("APP-1", depth="wiring") and there is no classpath step. Everything else is the same command and the same file.

Verifying what you install

Releases are signed. The installer always checks the artifact's checksum, checks the signature when gpg is present, and tells you which of the two it did. To refuse installing without a verified signature, or to pin a version:

curl -fsSL https://plumb.64bitspace.com/install.sh | PLUMB_REQUIRE_SIGNATURE=1 sh
curl -fsSL https://plumb.64bitspace.com/install.sh | PLUMB_VERSION=0.1.0 sh

The signing key is Flattop5377 <Flattop5377@proton.me>:

57C4 5ECD E870 35DB 5D6B  2AA9 675D DD55 F917 F71F

It is published on keys.openpgp.org and keyserver.ubuntu.com, so the key reaches you by a route that is not this website. That matters: the checksum protects against a corrupted download, but not against this host — whoever served you a bad artifact served you the installer that checks it. Only the signature closes that, and only if you did not take the fingerprint from here alone.

Releases and their checksums are browsable at /latest/, and every published version stays reachable at its own path.

Licence

Apache License 2.0. The full text ships in the artifact and with the source.