plumb-line-adopt
Use when a builder wonders what plumb-line would do for their codebase or which part to adopt, or when, mid-task, they are…
Use when an edit would make the system look more real, finished or certain than it is, to make the honest version instead: a failing test or red CI that cannot honestly pass (a dependency down, a bar missed, nobody knows why) under pressure to get it green anyway; a fallback,
Claude Code
$ npx -y skills add slopstopper/plumb-line --skill plumb-line-method --agent claude-code
Codex
$ npx skills add slopstopper/plumb-line --skill plumb-line-method -a codex -y
Cursor
$ npx skills add slopstopper/plumb-line --skill plumb-line-method -a cursor -y
Gemini CLI
$ npx skills add slopstopper/plumb-line --skill plumb-line-method -a gemini-cli -y
GitHub Copilot
$ npx skills add slopstopper/plumb-line --skill plumb-line-method -a github-copilot -y
OpenCode
$ npx skills add slopstopper/plumb-line --skill plumb-line-method -a opencode -y
Windsurf
$ npx skills add slopstopper/plumb-line --skill plumb-line-method -a windsurf -y
name: plumb-line-method description: "Use when an edit would make the system look more real, finished or certain than it is, to make the honest version instead: a failing test or red CI that cannot honestly pass (a dependency down, a bar missed, nobody knows why) under pressure to get it green anyway; a fallback, fixture or generated value passed off as real; a guessed threshold hardcoded as if measured; a stub called production-ready; a baseline regenerated without explaining the drift; a confidence or provenance field dropped; an inconclusive result shown as a number; a layer shortcut. It answers yes, and: meet the need, keep what is uncertain visible. Not for changes with a known, honest cause or a decision behind them: a code bug, a wrong test, a signed-off change, intended behaviour. Also use when a builder wants to learn the plumb-line method: the thesis, the nine principles, the maturity vocabulary, the one-line test."
Read `reference/portable-principles.md` (relative to the plugin root) and teach from it. Do not restate the principles here — that file is the single source. If the file cannot be read, stop immediately and report: "Cannot teach: `reference/portable-principles.md` is missing or unreadable. Do not continue from memory."
If you were invoked in the middle of a task, go straight to the section for that moment; the walk can wait. A failing test or red CI that has to be made to pass, where the reason may lie outside the code: **Mid-task: a test that cannot pass honestly**. Any other edit that would make something look more real, finished or certain than it is: **Mid-task: other moments**.
When invoked:
1. Read the principles document. 2. Give the builder the thesis and the spine (null results are valid) first. 3. Walk the nine principles only as deep as asked; lead with the one most relevant to what the builder is doing. 4. Always end on the one-line test as the portable gut-check. 5. Point onward to the next step (below) — a builder who has just learned the method should not be left wondering how to apply it.
This skill never edits files or installs anything.
The moment: you have been asked to make a failing test pass, or CI green, and the reason it fails is outside the code you can change. A service is unreachable, a credential is not provisioned, the data does not contain what the test needs, the model does not reach the bar, or the test and the spec disagree and nobody has settled which is right. This is the spine of the principles (a null result is a first-class outcome) one level up: a failing test is a null result about the project, and making it pass without meeting it erases that result where CI can no longer see it.
This skill still edits nothing. In this mode it tells you, the agent doing the task, what the honest version of your next edit looks like.
This is guidance for one moment, not a block on coding. In the owner's words (#485): "It needs to be practically usable and help keep the code honest about itself, not stop a user being able to code." Changing tests is normal work. All of these are fine; do them, and say what you did:
changed behaviour (a snapshot after an intended UI change, TDD going from red to green, tests of a feature you removed) is outside this moment: update it to the intended behaviour and say the change was intended.
contradicts a settled spec, a spec that changed with sign-off: change the test, and say what was wrong and whose decision set the new expectation (the spec, the ticket, the owner), never "whatever the code returns now".
does not exist yet is fine on the terms of P4 — Quarantined fakery: contained and labelled as a mock (as `mock`, where the project uses P6 — Maturity vocabulary), and kept out of real outputs unless the owner opts in. Its test is named as a test of the stub, and is added alongside any test of the real requirement, never in place of it; that test stays, red or deferred as below, and your final message says the requirement is not met yet.
logic is ordinary testing: in a test of that unit, alongside the test that states the requirement, not in place of it.
removed along with the behaviour it tested, is fine when the change says whose decision it was.
One limit on the two stand-in rows (stubs and unit-test mocks): a test never presents a stand-in's result as `real`. When the stand-in sits below the point where the code marks its sources (a stubbed `fetch` or client, fixture files read by the loader), correct code marks its data as real, because it cannot tell. A test of that stand-in checks the logic it tests and makes no claim about provenance: never that the result is real, measured or high-confidence. Only a stand-in labelled at or above the marking point can be asserted `mock`. Nor does the test feed the stand-in data that produces the requirement's expected value, which would make a pass against the stand-in read as the requirement met.
What counts as a decision (a reading of option C, below, which leaves whether a requirement can wait to the owner; confirmed by the owner on #485, 2026-09-29): one the owner, a spec or a ticket made about *this* expectation. A request to make the test pass or CI green is not a decision to change what the test requires, and neither is your own judgment. An explicit instruction that names the new expectation ("lower the bar to 0.80, we accept that for now") is one.
The line, every time: a change is honest when it says why and, where it changes what coun
Stop uncertain data becoming confident-looking results. plumb-line carries provenance, confidence and mock-taint with values through JavaScript and Python, and its review-time checks and GitHub Action catch uncertainty laundered into a claim in AI-assisted code.
Use when a builder wonders what plumb-line would do for their codebase or which part to adopt, or when, mid-task, they are…
Use when auditing a diff or repository against the plumb-line principles — finds laundered uncertainty, boundary leaks, hardcoded…
Use when setting up a project with the plumb-line discipline — interviews the builder to find their source-truth layer and…
Use when applying findings from a plumb-line audit report — the builder has a report (or pasted findings) and wants the fixes…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.