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.
These are enforced by an immutable Charter loaded at every session.
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.
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.
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.
Every session runs them in this exact order. Each has one job. Each writes into the sealed evidence bundle. Judge never writes code.
Streams the repo, builds a software map + dependency graph.
Nine secret patterns + dep-provenance probes (PyPI / npm / crates + OSV).
Extracts "when X → returns Y" claims with file+line citations.
Inverted symbol index. Every candidate carries ≥2 evidences.
Emits baseline characterization suites, executed in sandbox.
Proposes small patches. Cannot run without a passing baseline.
Applies patch to a sandbox worktree, diffs observed side-effects.
Compliance with target-design rules.
Before/after in reviewer's language, for every unit.
Owner (git blame), priority score, risk profile.
Cross-module summary docs.
Reads the whole bundle, decides. Never writes code.
A real open-source project. A real Laundry session. Real output. Nothing pre-recorded.
The iconic Python HTTP library. This version predates every modern Python best practice. Chosen because it's real, small, and legendary.
Read time: 30 seconds · Session laundry_9102768c9132
evidence_before_edit — 68 baseline tests failed on the UNCHANGED codebase (Python 3 imports vs. old Python 2 code).Skim the security section (5 mins), then merge through your normal CI. Laundry has no objections.
Full evidence: 156 artifacts, chain 516f187a3e21dc80…
requests/models.pyRequest — line 186Request is a class extends RequestHooksMixin. Public methods: prepare.
Matched test ✓
Author's note A user-created :class:`Request <Request>` object.
PreparedRequest — line 264PreparedRequest 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 534Response 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 52RequestEncodingMixin is a class extends object. Public methods: path_url.
| # | Module | Priority score |
|---|---|---|
| 1 | requests/models.py | 147.3 |
| 2 | requests/sessions.py | 132.6 |
| 3 | requests/adapters.py | 98.4 |
| 4 | requests/api.py | 67.2 |
| 5 | requests/utils.py | 54.8 |
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, ...)
requests/models.py3-engine ensemble · anti-hallucination pass rate: 100%
PreparedRequest.prepareI 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
Response.iter_contentI 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
RequestEncodingMixin._encode_filesI 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
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.