"Debugging should feel like playing a TAS - scriptable, replayable, reversible, intelligent."
Imagine an AI assistant that doesn't just write ABAP code - it understands, debugs, tests, and fixes it autonomously. Not through copy-paste chatbot interactions, but through deep integration with the SAP runtime itself.
┌─────────────────────────────────────────────────────────────────┐
│ CURRENT CAPABILITIES │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ✅ Read/Write Code ✅ Syntax Check ✅ Activate │
│ ✅ Unit Tests ✅ ATC Checks ✅ Breakpoints │
│ ✅ Debug Listener ✅ Step/Inspect ✅ Call Graphs │
│ ✅ Short Dumps ✅ SQL Traces ✅ ABAP Profiler │
│ ✅ CDS Dependencies ✅ Transport Mgmt ✅ RAP OData E2E │
│ │
│ The Agent can: Investigate → Analyze → Fix → Test → Deploy │
│ │
└─────────────────────────────────────────────────────────────────┘
Tool-Assisted Superplay for ABAP - Inspired by speedrunning tools.
┌─────────────────────────────────────────────────────────────────┐
│ TAS DEBUGGING │
├─────────────────────────────────────────────────────────────────┤
│ │
│ • Lua/JS Scripting - Automate debug workflows │
│ • Variable History - Track all state changes over time │
│ • Checkpoint/Restore - Save and restore execution state │
│ • Watchpoint Scripts - "When X changes, do Y" │
│ │
│ Example: │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ while true do │ │
│ │ local event = waitForBreakpoint(30) │ │
│ │ if not event then break end │ │
│ │ saveState("checkpoint_" .. event.hit_count) │ │
│ │ if detectAnomaly(getVariables()) then │ │
│ │ alert("Suspicious state!") │ │
│ │ end │ │
│ │ stepOver() │ │
│ │ end │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Record real execution → Extract reproducible tests → Replay in isolation
┌─────────────────────────────────────────────────────────────────┐
│ TEST EXTRACTION │
├─────────────────────────────────────────────────────────────────┤
│ │
│ PRODUCTION EXECUTION EXTRACTED TEST CASE │
│ ───────────────────────────────────────────────────────────── │
│ │
│ Method: ZCL_PRICING->CALCULATE CLASS lcl_test DEFINITION │
│ FOR TESTING. │
│ Inputs: │
│ IV_PRODUCT = 'WIDGET-01' METHOD test_calculate. │
│ IV_QUANTITY = 100 " Given (from recording) │
│ lv_product = 'WIDGET-01'. │
│ DB Read: MARA " Mock (from recording) │
│ → { MATNR, MTART, ... } mo_db->expect_select(...) │
│ │
│ Output: " Then (assertion) │
│ RV_TOTAL = 4250.00 assert_equals( 4250 ). │
│ │
└─────────────────────────────────────────────────────────────────┘
Fast, mocked environment for rapid patch iteration
┌─────────────────────────────────────────────────────────────────┐
│ PLAYGROUND │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Traditional: Playground: │
│ ──────────── ─────────── │
│ Setup data: 10 min Setup: 0 (from recording) │
│ Run test: 30 sec Run test: 0.3 sec │
│ 10 patches: 5 min 10 patches: 3 sec │
│ ───────────────── ─────────────────── │
│ Total: 20+ min Total: < 1 min │
│ │
│ $ vsp playground test_calculate_42 │
│ > run │
│ ✗ FAILED: Expected 4250, got 4200 │
│ > patch line:47 "LV_TOTAL = LV_AMOUNT * LV_QUANTITY" │
│ > run # <-- 0.3 seconds! │
│ ✓ PASSED! │
│ │
└─────────────────────────────────────────────────────────────────┘
Go backwards in time to find bugs
┌─────────────────────────────────────────────────────────────────┐
│ TIME TRAVEL │
├─────────────────────────────────────────────────────────────────┤
│ │
│ (vsp-debug) print LV_AMOUNT │
│ LV_AMOUNT = -500 # Wait, how did it go negative? │
│ │
│ (vsp-debug) rewind 5 # Go back 5 steps │
│ (vsp-debug) print LV_AMOUNT │
│ LV_AMOUNT = 500 # Still positive here │
│ │
│ (vsp-debug) step │
│ (vsp-debug) print LV_AMOUNT │
│ LV_AMOUNT = -500 # THIS is the bug! │
│ │
│ (vsp-debug) where │
│ → Line 47: LV_AMOUNT = LV_AMOUNT - LV_DISCOUNT. │
│ # Overflow! LV_DISCOUNT was 1000! │
│ │
└─────────────────────────────────────────────────────────────────┘
Multiple specialized agents working together
┌─────────────────────────────────────────────────────────────────┐
│ MULTI-AGENT DEBUGGING │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ INVESTIGATOR │ │ HISTORIAN │ │ THEORIST │ │
│ │ │ │ │ │ │ │
│ │ Gathers │ │ Tracks var │ │ Proposes │ │
│ │ evidence │ │ changes │ │ hypotheses │ │
│ │ from dumps │ │ over time │ │ for bugs │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └─────────────────┼─────────────────┘ │
│ │ │
│ ┌──────▼───────┐ │
│ │ FIXER │ │
│ │ │ │
│ │ Tests each │ │
│ │ hypothesis │ │
│ │ with patches │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Fork execution, try 3 different fixes simultaneously, see which one survives.
Evolve patches through natural selection - mutate, crossover, select.
AI monitors for dumps, auto-generates fixes, requests approval, deploys.
Gamified bug hunting with points, leaderboards, achievements.
Query execution history: SELECT * FROM trace WHERE LV_AMOUNT < 0
From: AI as a chatbot that suggests code To: AI as a senior developer that investigates, fixes, tests, and ships
The difference?
| Chatbot | Agent |
|---|---|
| Suggests code | Writes, tests, and commits code |
| You verify | It verifies itself |
| Copy-paste workflow | End-to-end automation |
| Guesses at bugs | Investigates with data |
| No memory | Learns from traces |
- GitHub: oisee/vibing-steampunk
- Reports: See
reports/for detailed technical designs - Discussions: Open an issue to propose ideas
"The best debugger is one that lets you ask 'what if?' and get an answer."