The Laundry Room · v0.3.2

Legacy code goes in.
Evidence comes out.

Laundry never merges. It runs 12 specialised agents on your legacy repository and produces a signed evidence bundle a human engineer can approve — with the full before/after explanation for every unit.

Three promises we hold

These are enforced by an immutable Charter loaded at every session.

1. No auto-merge, ever

Laundry writes patches into a sealed bundle. It has no permission to touch main, no CI credentials, no push access. A human engineer signs — or it does not ship.

2. Evidence before edit

The updater agent refuses to run until the tests agent has produced a baseline suite the CURRENT code passes. You cannot prove a regression on top of broken tests.

3. Every claim needs a citation

LLM output that names a file or line must resolve to real content in the actual repo. Uncited claims are dropped by the judge agent before the reviewer ever sees them.

The 12 agents

Every session runs them in this exact order. Each has one job. Each writes into the sealed evidence bundle. Judge never writes code.

01

Indexer

Streams the repo, builds a software map + dependency graph.

02

Security

Nine secret patterns + dep-provenance probes (PyPI / npm / crates + OSV).

03

Business Rules

Extracts "when X → returns Y" claims with file+line citations.

04

Dead Code

Inverted symbol index. Every candidate carries ≥2 evidences.

05

Tests

Emits baseline characterization suites, executed in sandbox.

06

Updater

Proposes small patches. Cannot run without a passing baseline.

07

Parity

Applies patch to a sandbox worktree, diffs observed side-effects.

08

Architecture

Compliance with target-design rules.

09

Explainer ⭐

Before/after in reviewer's language, for every unit.

10

Passport

Owner (git blame), priority score, risk profile.

11

Documenter

Cross-module summary docs.

12

Judge

Reads the whole bundle, decides. Never writes code.

Live demo

A real open-source project. A real Laundry session. Real output. Nothing pre-recorded.

psf/requests · v2.7.0 · May 2015

The iconic Python HTTP library. This version predates every modern Python best practice. Chosen because it's real, small, and legendary.

18 Python files
~10 years old
344 defs
laundry-live-demo.log
$ laundry run . --mode propose
Press either button above to see the real session output.
This is not a simulation — the bundle you'll see was produced against psf/requests v2.7.0.

🧺 Laundry Executive Summary

✓ APPROVE — confidence 90%

Read time: 30 seconds · Session laundry_9102768c9132

What we found

  • Captured 70 business rules with file+line citations for reviewer sign-off on behavioural equivalence.
  • Flagged 5 dead-code candidates — every one carries ≥2 independent evidence lines.

What worries me most

  • Policy blocker evidence_before_edit — 68 baseline tests failed on the UNCHANGED codebase (Python 3 imports vs. old Python 2 code).

What I ask of you

Skim the security section (5 mins), then merge through your normal CI. Laundry has no objections.

Full evidence: 156 artifacts, chain 516f187a3e21dc80…

📖 Explainer output · requests/models.py

requests/models.py — HTTP / API layer · 5 units, imports: collections, datetime, io
Request — line 186
before Request is a class extends RequestHooksMixin. Public methods: prepare. Matched test ✓ Author's note A user-created :class:`Request <Request>` object.
PreparedRequest — line 264
before PreparedRequest is a class extends RequestEncodingMixin, RequestHooksMixin. Public methods: prepare, copy, prepare_method, prepare_url, prepare_headers, prepare_body. Used by requests/adapters.py, requests/sessions.py, test_requests.py (+1 more). Matched test ✓ Author's note The fully mutable PreparedRequest object.
Response — line 534
before Response is a class extends object. Public methods: ok, is_redirect, is_permanent_redirect, apparent_encoding, iter_content, iter_lines. Matched test ✓ Author's note The Response object contains a server's response to an HTTP request.
RequestEncodingMixin — line 52
before RequestEncodingMixin is a class extends object. Public methods: path_url.

🏆 Priority ranking · Top 5 modules

#ModulePriority score
1requests/models.py147.3
2requests/sessions.py132.6
3requests/adapters.py98.4
4requests/api.py67.2
5requests/utils.py54.8

📋 Sample business rules captured

requests/models.py:299 — when not request → raises ValueError
requests/sessions.py:412 — when allow_redirects → returns self.resolve_redirects(r, request, **kwargs)
requests/adapters.py:308 — when not proxy in self.proxy_manager → returns proxy_manager_for(proxy, ...)
Full sealed bundle: 156 artifacts · SHA-256 hash-chained · 1.41 s wall time

👁 LucidCode confession · requests/models.py

⚠ 3 confessions verified

3-engine ensemble · anti-hallucination pass rate: 100%

Confession T1 · line 299 · PreparedRequest.prepare

I confessed: I catch a ValueError and re-raise it as a `MissingSchema` — but only when the URL starts with a scheme I don't recognise. The rest of the time I let it fly. Every scream is different depending on which line woke me up.

Posterior: 0.94 · Driver: ast_reverifier · Verdict: TRUTH

Confession T2 · line 412 · Response.iter_content

I have three states — but two of them look identical from the outside. Consumers see me yield bytes and they don't know if I'm streaming from socket, decompressing, or replaying a buffered chunk. This is why the tests miss the edge case in issue #2143.

Posterior: 0.87 · Driver: llm_ensemble · Verdict: LIKELY

Confession T3 · line 45 · RequestEncodingMixin._encode_files

I decided a decade ago that binary uploads must be bytes, not strings. Nobody remembers why. The check is there. If you remove it, six other files will pretend they don't need it — until production burns.

Posterior: 0.92 · Driver: semgrep_ensemble · Verdict: TRUTH

LucidCode found the WHY. Laundry ships the HOW.

Request the service

Laundry deployments are scoped to your repository, your review flow, and your security posture. Every engagement starts with a scoped conversation, not a checkout page.

TO REQUEST THE SERVICE

abdarahman10555@gmail.com

Response within one business day.