About
The stack behind PayUp
Splitting a bill properly is a complex software problem. PayUp reads receipts, calculates exact tax and tip, and reduces a whole trip to the fewest payments that settle it.
This is the third iteration of PayUp, and the first one properly engineered rather than vibe coded. Eighteen months ago, AI tooling could not hold a codebase to a standard. Today it is built requirements first, with strict test-driven development and multi-agent peer review. Here is how that works.
Requirements and strict TDD
- Architecture: The BMad Method handles competitive analysis and generates durable stories and architecture.
- Strict TDD module: A custom BMad module enforces a strict red-green-refactor cycle.
- Failure-mode analysis: Before writing tests, an agent classifies at least three plausible failure modes per behaviour as something to guard, escape with an error, or leave out of scope. Guards require a test that forces the failure.
- Test integrity: A failing test must fail for the right reason, and no test can be weakened to pass. Code is deliberately broken to ensure tests actually catch failures.
- The result: A regression net of 1,657 tests runs in under twenty seconds. Those tests act as review surface area — reviewing agents frequently find real bugs by working backward from a flawed test.
Multi-agent review loop
Claude Code writes the implementation, while Argus — a custom review agent, pluggable across providers and currently running Gemini 3.7 Flash — and CodeRabbit review every merge request.
- Asymmetrical learning: Argus costs about a cent per review, and learns exclusively from findings that CodeRabbit caught and Argus missed. That is what stops it reinforcing its own false positives.
- Allocating attention: Lessons are stored by location rather than by specific defect, serving as a prior to look closer at a directory rather than a mandate to find a particular bug.
- The result: Argus's recall improved from 39% to 94%, and the rounds of CodeRabbit review needed before a merge dropped from five-to-seven down to one or two.
The impact
Eighteen months ago, generating code was fast but troubleshooting took all day. Now tests catch boundary cases, reviewers catch what tests miss, and the memory loop makes the cheap reviewer continuously smarter. The real work has moved from supervising code generation to designing the reflection loops that check it.
PayUp is a beta tool built and maintained by one person. It works out who owes whom; it does not move money, and it is not a bank. If something is wrong, the fastest way to reach the person who can fix it is the help widget inside the app, or contact@payup.cloud. What it does and does not do is set out in the terms and privacy policy.