PLUMB 0.2 · exact transform compiler

Examples in.
Exact code out.
Or nothing.

Give PLUMB a few input/output pairs. It writes a Python function that reproduces every pair exactly: offline, in under a tenth of a second, with no model and no tokens. If the pairs don’t pin the program down, it stays silent rather than guess.

pairs.jsonPLUMB 0.2.0 · real output

Pairs in

  • 2026-11-03 10:15:02 ERROR disk full→"ERROR"
  • 2026-11-03 10:15:07 WARN cpu at 91%→"WARN"
  • 2026-11-03 10:16:00 INFO backup done→"INFO"

Function out Shipped

def f(s):
    return ([w for w in (s.split()) if w.isalpha()])[0]

split › keep_alpha › first · 0.034 s · 0 tokens

How it works

A compiler that refuses to guess.

Step 1

Give it pairs.

Three to twelve inputs with the outputs you want. Sample log lines and the fields an existing parser already pulled from them are ideal.

Step 2

It composes.

PLUMB searches short chains of its own basic steps over text, lists and numbers, and keeps only chains that reproduce every pair exactly.

Step 3

It ships, or stays silent.

If its ship rule judges that the pairs pin one program down, that function ships. Otherwise nothing ships, and plumb.first() hands the job to your model or a person.

Real runs

Two answers. Two silences.

Each card is PLUMB 0.2.0's actual output, run on a laptop on 3 November 2026. The new lines were never shown to PLUMB; they were run through the function it shipped.

Log level

Shipped

Pairs

  • 2026-11-03 10:15:02 ERROR disk full→"ERROR"
  • 2026-11-03 10:15:07 WARN cpu at 91%→"WARN"
  • 2026-11-03 10:16:00 INFO backup done→"INFO"

Function

def f(s):
    return ([w for w in (s.split()) if w.isalpha()])[0]

New lines

  • 2026-11-03 10:17:44 DEBUG cache warm→"DEBUG"
  • 2026-11-03 10:18:02 CRITICAL raid degraded→"CRITICAL"
  • 2026-11-03 10:18:09 ERROR 3 retries left→"ERROR"

split › keep_alpha › first · 0.034 s

HTTP status

Shipped

Pairs

  • GET /index.html 200→"200"
  • POST /login 302→"302"
  • GET /missing.png 404→"404"

Function

def f(s):
    return (s.split())[-1]

New lines

  • PUT /api/v1/items 201→"201"
  • GET /health 503→"503"

split › last · 0.034 s

Two programs fit

Silent

Pairs

  • [1, 2, 3, 4]→6
  • [6, 7]→6
  • [5]→0

PLUMB says

# silent: the examples do not pin the answer down (…)

“Sum all but the last” and “sum the even numbers” both reproduce every pair. On [2, 4] they disagree: 2 or 6. Its best candidate, droplast › sum, was contested, so nothing shipped.

0.053 s

Out of reach

Silent

Pairs

  • GET /index.html 200→200
  • POST /login 302→302
  • GET /missing.png 404→404

PLUMB says

# silent: no chain of its basics reproduces these examples

The same field, wanted as a number instead of text. No short chain of PLUMB’s basics makes that turn, so it says so. plumb.first() passes jobs like this to your model.

0.015 s

Proof

Measured in sealed tests.

Tasks, predictions and scoring were fixed and hashed before every run. A wrong answer counts against a right one.

112right

0 wrong. PLUMB alone on machine-written tasks across three sealed sets. Silent on about half.

3of 3

Head-to-heads won. PLUMB first, with Claude Opus 5.5 only where PLUMB was silent, beat Opus 5.5 alone: 73–63, 79–75, 87–81.

40–46%

Fewer LLM calls in those head-to-heads, because PLUMB answered first.

$0

Per call, offline. Under a tenth of a second per task on a laptop, the same program every run, no tokens.

Zero wrong in 112 still allows a true error rate of up to about 2.7% at 95% confidence. Every test task was machine-written and checked so that its examples pin it down; real data comes with no such check, and pairs that fit more than one program can slip through (in one test, 2 of 58 answers were wrong that way). The next sealed test rebuilds public log parsers’ field extractors from a few pairs and scores every held-out line.

Where it fits

Built for pipelines, not chat.

Seven possible uses, ranked on four questions: are input/output pairs the native input, is a wrong answer costly, does volume rule out a model call per item, and is the space still open? The ranking runs nearly opposite to market size.

  1. 1

    Log field normalization

    Writing, migrating and repairing the extractors that pull fields out of log lines in security and observability pipelines.

    High fitStart here
    In the real worldDatadog has about 33,400 paying customers1; Splunk reported 19,400+2; Cribl counts 43 of the Fortune 1003. Their AI parser generators are in preview or beta, or need human review, and none publishes accuracy4.
    PLUMB’s estimateAbout 100 companies at $990 a year, roughly $99,000. That is 0.3% of Datadog’s customer count.
  2. 2

    Inside data-onboarding and ETL products

    A by-example step licensed (OEM) into import, ETL and integration tools.

    Medium-highSecond
    In the real worldFivetran has 7,700+ customers5. Microsoft PROSE, the engine behind Flash Fill, is licensed for non-commercial use only and no longer released6.
    PLUMB’s estimateFour vendor deals at $24,000, roughly $96,000 a year, once a public proof exists.
  3. 3

    Compiling repeated LLM calls

    A model’s logged outputs are ready-made pairs; each compiled function replaces a stream of future calls.

    MediumTest first
    In the real worldOpenRouter alone serves 5M+ developers7, but each avoided call is cheap, and a model’s consistent mistake would compile faithfully.
    PLUMB’s estimateNone until it passes its own sealed test.
  4. 4

    A tool coding agents call

    Exact transforms on demand, when the agent already holds pairs.

    MediumChannel
    In the real worldGitHub Copilot passed 20M all-time users8; 65.9% of developers use coding assistants or agents9.
    PLUMB’s estimateA free route into uses 1 and 2, not a market of its own.
  5. 5

    Regulated and air-gapped sites

    Transforms written where the data may not leave the building.

    High fit, thin demandEnterprise tier
    In the real world90% of organizations see local storage as safer10, yet few are barred from cloud AI.
    PLUMB’s estimateA few sites at $6,000–12,000 a year each.
  6. 6

    General coding and cost routing

    A first pass in front of an LLM for everyday code.

    LowAvoid
    In the real worldKite reached 500,000 developers and shut down because individual developers would not pay11. PLUMB lost every test where the job arrived as words.
    PLUMB’s estimateNot pursued.
  7. 7

    Spreadsheet and regex helpers

    By-example features for analysts.

    LowAvoid
    In the real worldFlash Fill comes free with Excel, and Microsoft 365 has about 450M commercial seats12.
    PLUMB’s estimateNot pursued.

PLUMB’s first-year target, next to products people already use

Log scale. Each product’s figure is its own reported count. PLUMB’s figures are targets worked out from conversion benchmarks, not forecasts.

Paying customers

  • DatadogJun 202633,400
  • SplunkJan 2020, last count19,400+
  • FivetranDec 20257,700+
  • Sidekiqone founder, 202313~2,000
  • ScreenshotOneone founder141,000+
  • PLUMBfirst-year target100

Users

  • GitHub Copilotall-time, Jul 202520M+
  • OpenRouterdevelopers served5M+
  • Kiteshut down 2022500,000
  • PLUMBfree users, first-year target1,800–3,600
20,000–40,000

well-targeted visitors to this page in a year.

1,800–3,600

free sign-ups, at 90 per 1,000 visitors15.

~100

paying companies, at 5 per 1,000 visitors; developer tools convert at about half that rate16, hence the 40,000.

≈ $99,000

a year at $990 each. Four OEM deals at $24,000 bring in about the same.

For scale: one founder runs Sidekiq with about 2,000 customers, and ScreenshotOne passed 1,000 with no employees. Kite had 500,000 users and could not charge them, which is why PLUMB sells to companies, not to individuals.

Pricing

Pay for answers. Silence is free.

Proposed prices from our market research. PLUMB is in private preview and not on sale yet.

Community
Free
students, research, open source
  • 100 shipped functions a month per machine
  • Silent answers never count
  • The code it writes is yours, with no runtime fee
Solo
$90
a year, or $9 a month · about $29 a year in India
  • One named person, commercial use
  • 2,000 shipped functions a month
Company For most teams
$990
a year, flat, per organization
  • Unlimited users, CI runners and agent calls
  • Email support and a 14-day refund
  • Keep a working version after 12 paid months
Enterprise
$6k–12k
a year ($6,000–12,000), for regulated and air-gapped sites
  • Offline licenses locked to a machine
  • Signed builds and a log of every synthesis
  • Priority support
OEM
$6,000+
a year for vendors with up to 20 staff
  • $24,000–60,000 a year above that, with a set volume
  • Then $0.002–0.01 per shipped function
  • Binary engine, white-label, redistribution rights
Metered
$0.01
per shipped function, falling to $0.002
  • First 1,000 a month free
  • Pay only for functions that pass every pair
  • Silence is free

Limits

What PLUMB is not.

We tested PLUMB outside its niche too. It lost, and the losses draw the border.

Not a coding assistant.

When jobs arrive as words, a frontier model writing the code wins: Claude Opus 5.5 scored 60 right and 0 wrong; Opus writing examples for PLUMB scored 56 right and 2 wrong.

Not an agent planner.

As a laptop terminal agent it finished 17 of 30 jobs. A 4B model alone finished 23, and Opus 29.

Not a cost router.

It cut the dollar bill by only 12–13%, because the tasks it answers are the cheap ones. Routing those calls to a small model saves about as much.

Not a schema matcher or a prover.

Deciding which field maps to which is a job for a model or a catalog. And PLUMB’s functions are exact on the pairs given, not proven for every possible input.

Install

Three calls. One rule.

A function ships only when it reproduces every pair and PLUMB judges that the pairs pin it down.

Python
import plumb

pairs = [("2026-11-03 10:15:02 ERROR disk full", "ERROR"),
         ("2026-11-03 10:15:07 WARN cpu at 91%", "WARN"),
         ("2026-11-03 10:16:00 INFO backup done", "INFO")]

plumb.solve(pairs)      # the function's source, or None
plumb.explain(pairs)    # chain, code, shipped or not

# PLUMB first; your model only where it is silent
code, source = plumb.first(pairs, fallback=my_model)
Command line
pip install plumb-0.2.0-py3-none-any.whl

plumb pairs.json
# prints the function, or why it is silent

plumb --json pairs.json
# shipped, code and chain as JSON

# exit code: 0 shipped · 1 silent · 2 usage
  • Python 3.10 or newer
  • No dependencies
  • Runs offline
  • Private preview: 0.2.0 is not on PyPI yet