Real product-team discipline, delivered at machine speed.

RevampKey plans the states, the design and the spec before it writes any code, and keeps you in control by revising all three every time you correct it.

Linux too. Free to start.

RevampKey / payments-service
payments-service3 repositories in workspace

Ready to revamp payments-service?

Review my uncommitted changesExplain this codebaseFix a failing test
Describe a change, a bug, or a question…
Agent@ context
Refund lifecycledraftv1
FilesChangesModulesSpecsDesignFlows
Project
Partial refunds on checkout
Not started

Click a stage to jump. Hover the frame to pause.

The run above is one task, followed end to end: adding partial refunds to a payments service. Every diagram, spec and commit further down this page comes from that same run.

Flow

It draws the states before it writes the code.

Take the task above. The hard part of a refund isn’t the refund. It’s the order that was only half captured, the webhook that arrived twice, the card that expired mid-retry. RevampKey draws those branches first and asks you to correct them before it writes anything.

Flows tab·.revampkey/plans/a41f9c/flow.v1.json
Refund lifecycledraftv1payments-service
requestedvalidatedexceeds_capturedalready_refundedduplicate_webhookauthorizedcard_expiredgateway_pendinggateway_timeoutgateway_declinedgateway_settledsettled_mismatchledger_writtenledger_write_failedreconcile_requiredcustomer_notifiedcompleted
17 states · 9 of them failure pathscompletesfails, and has to be handled

Nine of the seventeen states are failures. You correct them here, while the flow is still a draft, before any code exists to be undone.

draft

Still being corrected by you. Nothing here constrains the build yet. This is the moment changing your mind is free.

active

Settled. From here it governs new work, and every later change to it is a numbered revision you can read back.

Artifacts

Every decision it made is a file you can open.

The diagram, the screens, the spec and the module list are written into your project with their own revision history, so “why did we do it this way” still has an answer six weeks later.

Plan pane·the same run, six tabs

Files

payments-service
payments-service/
+ ledger/migrations/0042_refund_events.sql
+ ledger/refund_events.py
~ refunds/service.py
~ refunds/idempotency.py
~ gateway/adapter.py
~ webhooks/handler.py
+ tests/payments/test_partial_refund.py
checkout-web/
~ src/orders/RefundPanel.tsx

The file list is the run’s own record of what it touched, kept beside the plan that said it would.

Changes

5 commits
feat(ledger): add refund_events table and migration
feat(refunds): partial refund service with idempotency key
feat(gateway): partial capture adapter for settled payments
feat(checkout): refund panel with partially-refunded state
fix(webhooks): make duplicate refund webhook a no-op

One commit per module, each written when that module’s criteria passed, not one commit at the end.

Modules

5 of 5 done
Ledger schema & migration
Done3 tasks · 2 criteria
edits ledger/migrations/0042_refund_events.sql
Refund service & idempotency
Done5 tasks · 4 criteria
edits refunds/service.py
Gateway adapter for partial capture
Done4 tasks · 3 criteria
edits gateway/adapter.py
Refund panel
Done4 tasks · 3 criteria
edits checkout-web/src/orders/RefundPanel.tsx
Webhook reconciliation
Done3 tasks · 3 criteria
edits webhooks/handler.py

The tracker the run worked from: every module, its tasks, and the criteria it had to pass before the next one opened.

Decisions

v3revised twice after you corrected the flow
01

A refund can never exceed the captured amount.

Enforced in the service, not the UI, because the gateway webhook can also initiate one.

02

A duplicate webhook must be a no-op.

The gateway retries for up to 24 hours; the refund is keyed by its idempotency key, not its arrival.

+ added in v3, after you flagged the retry window
03

A partially refunded order stays open until it is fully settled or cancelled.

Closing it early loses the remaining balance in reporting.

04

Ledger writes come before customer notification.

A customer must never be told about money the ledger has no record of.

+ added in v3

The spec is the decisions the flow and the screens forced, with the reason each one was made and the revision that added it.

Design

3 artboardslinked to the flow’s states
refund-panel · desktop1440
amount · 24.00 of 89.00
refund-panel · mobile390
amount
state · partially refundedderived
65.00 remaining

Screens are drawn as real artboards on the project’s canvas, one per state the flow declared, so the surface and the behaviour cannot drift apart.

Refund lifecycle

v2active
v2  ·  promoted to active  ·  17 states, 9 failure paths
v1  ·  draft  ·  12 states. You added the retry window and the ledger-failure branch

The diagram above in section two is this file. It is stored in your repository, it has two revisions, and you can read the difference between them.

Every tab here is a file in your project folder. They stay readable with RevampKey closed, and they are what a reviewer opens six weeks later.

Sizing

A one-line fix stays a one-line fix.

There is no mode to switch on: RevampKey sizes each request itself: a thirty-line change is made and checked with no ceremony, and only work that crosses files and states gets the diagram, the spec and the module breakdown.

Three requests·what each one was given
Fix the off-by-one in paginate()
Read the call sites
Make the change
Run the test
1 file · 12 lines · no plan created
Add a status column to orders
Read the call sites
Make the change
Run the test
Break into modules
4 files · tracker, no flow
Add partial refunds to checkout
Read the call sites
Make the change
Run the test
Model the states
Write a spec
Break into modules
18 files · 3 repositories · full run

One control appears in none of these three panels: a setting for how much planning to do. That is the point.

Modules

No forty-file dump at the end.

Each module lands as its own commit against its own acceptance criteria, and RevampKey checks the running result, not the file it just typed, before it opens the next one.

Modules tab, mid-run·and what module 2 had to pass
Modules · payments-service
Ledger schema & migration
Done3 tasks · 2 criteria
edits ledger/migrations/0042_refund_events.sql
2
Refund service & idempotency
Active5 tasks · 4 criteria
edits refunds/service.py
3
Gateway adapter for partial capture
Waiting4 tasks · 3 criteria
edits gateway/adapter.py
4
Refund panel
Waiting4 tasks · 3 criteria
edits checkout-web/src/orders/RefundPanel.tsx
5
Webhook reconciliation
Waiting3 tasks · 3 criteria
edits webhooks/handler.py
Verification
pytest tests/payments -q
.........................
27 passed in 4.31s
390px ✓768px ✓1440px ✓rendered, not read
Acceptance criteria · module 2
A refund above the captured amount is rejected before it reaches the gateway.
A duplicate webhook for the same idempotency key changes nothing.
A gateway timeout leaves the order in gateway_pending, never in completed.
A ledger write failure blocks the customer notification.

Module 2 is running; module 1 already has its commit. The tests and the three breakpoint checks ran against the built result, not against the file that was just typed.

Asserting that a file you just wrote contains the strings you wrote into it is the code checking its own spelling.

RevampKey’s own verification rule
Specialists

On hour four, it still knows what it decided in hour one.

Work goes to specialists: one that reads code, one that writes it, one that draws screens, one that handles version control, and one that drives your connected tools. Each works on a clean desk, reporting back to the lead that keeps the whole picture.

Module 2 of the run above·who did the work, and what came back
Module 2 · refund service & idempotency3m 12s
code_exploration· reads the code
✓ Finished41s
Explored 9 files, 4 searches, 1 tool
code_editor· writes the change
Working1m 08s
TaskAdd an idempotency key to the refund service. Reject any amount above the captured total. Keep the existing retry semantics.
Reporting backFollowing the pattern already used in captures/service.py, with the same key derivation and table.
design· draws the screens
✓ Finished2m 14s
3 artboards on the shared canvas
git_workflow· handles version control
✓ Finished6s
1 commit · feat(ledger): add refund_events table and migration
mcp_operations· drives connected tools
✓ Finished19s
Sentry · 2 open refund errors in the last 7 days

Nothing it learned gets thrown away.

Two hours and forty messages later, the finding from hour one reopens in place.

record · exploration/0007 · reopened from summaryThree files own payment state: refunds/service.py, webhooks/handler.py, ledger/entries.py. The gateway adapter retries for 24h, which is why a duplicate webhook is not a rare case.

It searches the grammar, not the text.

callrefunds/service.py:88capture_payment(order, amount)
defgateway/adapter.py:12def capture_payment(...)
callcheckout-web/src/api.ts:40capturePayment(orderId)
skippedCHANGELOG.md:210# capture_payment renamed
skippedadapter.py:9# TODO: capture_payment retry

Each block is one specialist’s task and the finding it reported back. The lead keeps the findings, not the raw work, which is why hour one is still available in hour four.

Scope

A database migration gets the same treatment as a checkout screen.

A schema change, a retry policy, a permission rule, a queue that must drain before deploy. Each gets the same diagram, the same spec, and the same checked commit, across every repository in your workspace.

Workspacepayments-servicecheckout-webnotificationsone project
Six more runs·same workspace, same artifacts
Drain the notification queue before deploy
notifications
FlowSpecNo UI
Split the users table across two services
payments-service
FlowTracker · 6 modulesNo UI
The retry policy caps at 5
payments-service
Spec only
Tighten row-level permissions on orders
payments-service
FlowTracker · 3 modulesNo UI
Cut p95 on the search endpoint
checkout-web
Tracker · 2 modulesTerminal runsNo UI
Add partial refunds to checkout
3 repositories
FlowDesign · 3 artboardsSpecTracker · 5 modules

Only one of these six opens a screen: the refund panel from the run at the top of this page. The diagram, the spec, the modules and the checked commit are the same either way.

Privacy

The plan lives in your repo, not on our server.

Specs, trackers and diagrams are written into your own project folder, nothing you work on is stored in the cloud or used for training, and tokens for the tools you connect stay in your operating system’s keychain.

On the left·what RevampKey wrote into the project·on the right·where the credentials sit
payments-service / Explorer
payments-service/
.revampkey/
plans/
a41f9c/
design_spec.md
tracker.json
flow.v2.json
ledger/
refunds/
tests/
.gitignore  ·  .revampkey/    .env    added automatically
Connected servers
GitHub3 toolsConnected
Sentry2 toolsConnected
Postgres5 toolsConnected

Tokens are stored securely in your OS keychain and never leave this machine.

Sign-in runs on Keycloak. Read the privacy policy

Start

Open the repo you’ve been avoiding.

Point RevampKey at the change you keep postponing, and read the plan before you decide whether to let it build.

Describe a change, a bug, or a question…
Agent@ context
Review my uncommitted changesExplain this codebaseFix a failing test

macOS 12+ · Windows 10+ · Ubuntu 20.04+  ·  See what shipped in 2.4.0