Files
Rpa_Skills/tests/evals/results/handoff/h-packaged-desktop-screens-r1.md
T
VasanthandClaude Opus 5.5 3942fad6cd Add rpa-bot-handoff skill: ops guide for bot handover
The skill scans a bot with subagents (never runs it) and writes
HANDOVER.md, an 11-section ops guide in the operator's order: where is
what, how to run, how long to wait, after the run, how to see an
exception, exception list, how you will know, how to tell us, don'ts,
issues seen before. Dev material (check against 12 failure classes from
Tebra Auto Post, gaps with file:line, incidents) goes to HANDOVER-DEV.md.

Also adds ADR-0004, glossary terms, five fixture bots and a handoff eval
runner (--resume, --regrade) with results from 47 runs of the earlier
13-section version. The grader still expects that structure and must be
updated before the next eval run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 15:01:42 +05:30

179 lines
21 KiB
Markdown

# LedgerBot - ops handover
Version 3.2.0 · Written 2026-10-23 · Escalation: raise a ticket in the **RPA Support** queue
## 1. What the bot does
LedgerBot checks the daily bank statement against LedgerPro, the desktop accounting app. You give it the bank statement Excel when you start it. It opens LedgerPro, exports LedgerPro's entries to Excel and compares each statement line with them by reference and amount. Any statement line that is not in LedgerPro gets posted there by the bot: it clicks **New entry**, types the reference and amount, and clicks **Save**. At the end it writes one result file, `Reconcile_<date>_<time>.xlsx`, in the output folder. Each statement line gets a Result there: OK, Missing, Mismatch or Error. The only app it drives is **LedgerPro**. It runs once per statement, whenever ops starts it.
## 2. How it works
```
launcher.exe (what you start, with the statement file)
├─ checks for a newer LedgerBot build, installs it if found
└─ starts → LedgerBot.exe ──drives (mouse + keyboard)──> LedgerPro
│ (do not touch while it runs)
├─ reads → your bank statement Excel
├─ reads → LedgerPro's export (data\ledger_export.xlsx)
└─ writes → output folder: Reconcile_<date>_<time>.xlsx
```
- **launcher.exe** checks the update server, installs a new version if there is one, then starts LedgerBot. It shows nothing on screen.
- **LedgerBot.exe** does the work. It has no window of its own, no buttons and no progress display. It works by finding LedgerPro's buttons on the screen *by their picture* and clicking them.
- **LedgerPro** is the accounting app. While the bot runs, the mouse and keyboard belong to the bot.
- **Output folder** (`data\output`) gets one result file per run. It is the only record ops can open.
**One run, step by step:**
1. The bot opens LedgerPro from its Desktop shortcut and waits 15 seconds.
2. It clicks LedgerPro's **Export to Excel** button and waits 10 seconds.
3. It reads LedgerPro's exported entries and your statement (column A = reference, column B = amount, from row 2).
4. It compares each statement line with LedgerPro: OK, Missing or Mismatch.
5. For each Missing line it posts the entry: New entry → type reference → Tab → type amount → Save.
6. **Only at the very end** it saves the result file to the output folder. If the run stops earlier, there is no result file at all.
## 3. Before a run
- [ ] **Display: Scale 100% and resolution 1920 x 1080** (Windows Settings → System → Display). Check this again after docking the laptop, adding a monitor or a Windows update. At any other setting the bot cannot find LedgerPro's buttons (E03, E07, E08).
- [ ] The **LedgerPro** shortcut is on your Desktop or on the Public Desktop, and its name is exactly `LedgerPro`. Without it nothing happens (E02).
- [ ] LedgerPro opens straight to its main screen with **no sign-in prompt and no popup**. The bot does not sign in and does not close popups.
- [ ] LedgerPro is **closed** before you start; the bot opens it itself.
- [ ] The folders `logs`, `data` and `data\output` exist next to `LedgerBot.exe`. The bot does not create them. If one is missing, the run fails (E01, E05). Ask dev/IT to set them up once; ops does not need to open `logs`.
- [ ] Statement Excel rules:
- The data is on the **first sheet** (the one that opens by default). Row 1 is a header; data starts on row 2.
- Column A = reference, column B = amount. **Every row with a reference must have a number in column B**: no text, no blanks, no "1,234.00 CR". Otherwise the whole run fails with no output (E04).
- **Each reference only once.** If a reference appears twice, the bot silently keeps only the last line (E10).
- Type references **exactly as LedgerPro shows them**, and format column A as Text. Bad: `123` when LedgerPro has `00123` (Excel drops the zeros), or `INV-55 ` with a trailing space. Good: `00123`, `INV-55`. A reference that doesn't match exactly is treated as Missing and **posted again** (E15).
- [ ] Version: there is no place where ops can see the version today (see section 10).
## 4. During a run
- **Hands off the mouse and keyboard.** The bot types into whatever window is in front. If you click into another window (email, chat), the reference and amount get typed there and LedgerPro is not updated (E12).
- Don't cover, move or minimise LedgerPro, and don't open other windows on top of it.
- **Don't move the mouse into the top-left corner of the screen.** That is the bot's emergency stop: the run ends at once, with no result file.
- **To stop the bot:** move the mouse pointer into the top-left corner of the screen, or end `LedgerBot.exe` in Task Manager. **Closing LedgerPro does not stop it**; the bot keeps clicking and typing. After a stop, there is no result file. Check LedgerPro by hand for entries already posted before you re-run (E05).
- A run looks stuck when the mouse hasn't moved for more than a minute. The bot waits at most **20 seconds** for any button, so a real run never sits still that long. If nothing has happened for a few minutes, the run has ended, maybe without a result file. Check the output folder.
## 5. Where to look when something goes wrong
| Question | Where to look |
|---|---|
| Did the run finish? | Output folder `data\output`: a new `Reconcile_<date>_<time>.xlsx` with the time of your run. **No new file = the run did not finish** (E01-E05). |
| Which lines failed? | The Reconcile file → filter the **Result** column for `Error` and `Mismatch`. |
| Why did one line fail? | The **Note** column on the same row. |
| Was the entry really posted? | LedgerPro itself: search for the reference. The bot does not check after Save. |
| Did the bot already retry? | It never retries a line. For each button it keeps looking for 20 seconds; after that the line is Error. |
| Which version is running? | Ops cannot see it today (see section 10 and *Fix before handover*). |
| Why did a run end with no result file? | Nothing ops can open says why. Raise a ticket (section 11). |
## 6. Statuses
The Reconcile file is plain Excel, so there are no colours.
| Result | Note | Meaning | What ops does |
|---|---|---|---|
| OK | (empty) | Reference and amount match LedgerPro (within 0.01). | Nothing. |
| Missing | Posted | The line was not in LedgerPro and **the bot posted it**. "Missing" here means "was missing, now posted". The bot clicked Save but **did not check the save worked**. | Spot-check a few in LedgerPro. Nothing else if they are there. |
| Mismatch | LedgerPro has `<amount>` | The reference exists in LedgerPro with a different amount. **The bot changes nothing.** | Correct it by hand in LedgerPro or with Finance (E09). |
| Error | Button new_entry.png not found on screen | The line was Missing, but the bot could not find LedgerPro's **New entry** button. Probably not posted. | E07 |
| Error | Button save_btn.png not found on screen | The bot typed the entry but could not find **Save**. **It may or may not be saved.** | E08: check in LedgerPro before any re-run. |
| (no file) | - | The run stopped before the end. **Nothing is recorded for any line**, even lines already posted. | E01-E05 |
Not reported at all: entries that are in LedgerPro but **not** on the statement. The bot ignores them.
## 7. Exception catalogue
| ID | What you see | How the bot identifies it | Where it is recorded | Type | Who acts | What to do | Escalate when |
|---|---|---|---|---|---|---|---|
| E01 | You start the bot and **nothing happens at all**: LedgerPro doesn't open, no result file | The bot stops before it begins: no statement file was given, or the `logs` folder is missing next to the exe | Nowhere ops can open | System | Ops, then Dev | Start it again with the statement file (for example, drag the statement Excel onto `launcher.exe`). | It still does nothing → ticket: laptop name, time, "E01". |
| E02 | Nothing opens; no result file | It looks for a shortcut named `LedgerPro` on your Desktop and the Public Desktop; if none, it stops | Nowhere ops can open | System | Ops | Put the LedgerPro shortcut back on the Desktop with the exact name `LedgerPro`, then re-run. | The shortcut is there and it still fails → ticket: laptop name, time. |
| E03 | LedgerPro opens, **nothing gets clicked**, the run ends with no result file | It looks for the **Export to Excel** button picture for 20 s; if it never matches, the run stops. Nothing was posted. | A screenshot in the dev log folder (ops can't open it) | System | Ops, then Dev | Check: Display scale 100% and 1920 x 1080; LedgerPro on its main screen with no sign-in or popup; nothing covering it. Fix that, then re-run once. | Fails again with the settings right, **or** it happens on every laptop right after an update (broken build) → ticket: laptop name, time, screenshot of the screen. |
| E04 | LedgerPro opens, Export is clicked, then **the run ends with no result file** and nothing is posted | It could not read the data: an amount that is not a number in your statement or LedgerPro's export, or the export file is not where it expects it | Nowhere ops can open | Business or System | Ops, then Dev | Check that every row of your statement has a plain number in column B, fix it, then re-run. | The statement is clean and it still fails → ticket: laptop name, time, the statement file (send it through the ticket, not chat). |
| E05 | Some entries were posted in LedgerPro but **there is no result file** | The run stopped part-way: someone stopped it, the mouse hit the top-left corner, a button error the bot can't handle, or the `data\output` folder is missing (then it fails at the very end, after posting everything) | Nowhere. The posted entries are in LedgerPro only. | System | Ops, then Dev | **Don't re-run straight away.** In LedgerPro, look up the statement references to see which were posted. Check `data\output` exists. Then re-run once: the bot re-exports, so posted lines should come back OK. | It happens twice → ticket: laptop name, time, which references were posted. |
| E07 | Result **Error**, note "Button new_entry.png not found on screen" | It looks for LedgerPro's **New entry** button for 20 s; if it never matches, it marks the line Error and goes to the next line | Reconcile file, Result + Note | System | Ops | Check display scale/resolution. Look the reference up in LedgerPro; if it isn't there, re-run (only Missing lines get posted). | Every Missing line errors with the settings right → ticket: Reconcile file, laptop name. |
| E08 | Result **Error**, note "Button save_btn.png not found on screen" | It typed the reference and amount, then looked for **Save** for 20 s and didn't find it. The half-filled form is **left open**, and the **next** line is typed on top of it. | Reconcile file, Result + Note | System | **Ops** | **Check in LedgerPro first**: is this reference saved, and is the amount right? Also check the **next** line's entry. Delete or fix any wrong or half-done entry by hand. Only then re-run. Re-running without checking can post it twice. | Several lines in one run → ticket: Reconcile file, laptop name, time. |
| E09 | Result **Mismatch**, note "LedgerPro has 123.45" | The reference is in LedgerPro but the amounts differ by more than 0.01 | Reconcile file | Business | Ops | Find out which amount is right (statement or LedgerPro) and correct it by hand. The bot never changes amounts. | Never; it is a business task. |
| E10 | A statement line has **no row** in the Reconcile file; fewer rows than the statement | The same reference appears twice in the statement (or in LedgerPro); the bot silently keeps only the last one | Nowhere; count the rows to notice | Business | Ops | Before the run, remove or merge duplicate references. After the run, compare row counts: statement vs Reconcile file. | - |
| E11 | **The same entry posted twice** in LedgerPro | Nothing detects it. Causes: re-running after E08 without checking, or LedgerPro's export not saving fresh, so the bot compares against an old export | Nowhere | System | Ops, then Dev | Delete the duplicate in LedgerPro by hand. | It happens with no E08 before it (stale export) → ticket: Reconcile file, time, references. |
| E12 | Reference and amount **typed into another window** (email, chat); entries missing in LedgerPro, maybe marked Missing/Posted | The bot types into whatever window is in front; it never checks it is LedgerPro | Nowhere; the Reconcile file may still say Posted | System | Ops | Check those references in LedgerPro and post them by hand, or re-run. Hands off during runs (section 4). | - |
| E13 | After a release, **the laptop still runs the old version** | The launcher couldn't reach the update server (offline, or the server's certificate not trusted) and starts the old version without saying so | Nowhere | System | Dev | Raise a ticket naming the laptop. | Always, once dev announces a release. |
| E14 | After a release, **double-clicking launcher.exe does nothing**; the bot never starts | The update was found but the download or unzip failed; the launcher stops | Nowhere | System | Dev | Raise a ticket: laptop name, time. | Always. |
| E15 | A line that **is** in LedgerPro shows **Missing / Posted**, so there is now a duplicate | The reference doesn't match LedgerPro character for character (lost leading zeros, extra space, different case) | Reconcile file shows Posted | Business | Ops | Delete the duplicate in LedgerPro. Fix the reference in the statement (column A as Text, exact spelling). | - |
(E06 is not used.)
## 8. What the bot recovers by itself
| Problem | What the bot does | Limit | After the limit |
|---|---|---|---|
| A LedgerPro button is not on the screen yet | Looks again every second | 20 s per button | Export button: the run stops, no result file (E03). New entry / Save: the line is Error, next line (E07, E08). |
| LedgerPro slow to open | Fixed wait, no check | 15 s | Goes on regardless; usually ends as E03 |
| Export slow to save | Fixed wait, no check | 10 s | Goes on regardless; may read an old export (E11) |
| Update server unreachable | Starts the current version | 10 s | Old version keeps running (E13) |
There are **no** retries per line, no restarts and no resume. A failed line is retried only when ops re-runs the whole statement. Lines already posted then come back OK, as long as LedgerPro's export is fresh.
## 9. Known incidents
All three are recorded in the history as fixed on 2026-10-23. In the code, though, each "fix" is only a note; the bot's behaviour is unchanged (see section 13).
| When / version | What ops saw | Cause | What to do now | Ops could handle? |
|---|---|---|---|---|
| 2026-10, 3.2.0 | Lines Error "Button save_btn.png not found on screen" on some laptops | Laptops at 125% display scaling; the button pictures were taken at 100% | **Keep 100% scale and 1920 x 1080** (section 3). Check each Error line in LedgerPro (E08). | Partly |
| 2026-10, 3.2.0 | Two laptops stayed on the old version, with no message | Update server's certificate not trusted; the launcher hid the error | Raise a ticket after every release if a laptop didn't update (E13). Ops can't confirm the version yet. | Partly |
| 2026-10, 3.2.0 | Exe build couldn't find any button (every run fails at Export) | The button pictures were left out of the exe build | Dev rebuild. Ops: E03 on every laptop right after an update → ticket. | No |
## 10. Releases and version check
- **How an update arrives:** `launcher.exe` checks the update server every time you start it. If there is a different version, it downloads and installs it next to the exe, then starts the bot. It shows nothing on screen.
- **How to confirm it applied:** today **ops cannot see the version**. The bot has no window and no title bar, and neither the log nor the result file records the version. Ask dev to confirm per laptop.
- **If the version did not change:** raise a ticket with the laptop name (E13). Don't copy files between laptops yourself.
- Laptops on different versions don't break each other; the bot shares nothing between machines.
## 11. Escalating to dev
Raise a ticket in the **RPA Support** queue. Send:
- the exception ID from section 7 (for example "E08"),
- the laptop name,
- the date and time you started the run,
- the statement file name,
- the Reconcile file from `data\output`, if there is one,
- a screenshot of the screen if the bot stopped on something.
Dev collects the log and the "button not found" screenshot from the laptop themselves.
Never send: passwords, the bot's settings file, or bank or customer data in chat. Attach files to the ticket only.
## 12. Failure-class check
- F1 covered in section 3 (shortcut, folders, no sign-in prompt), E01, E02, E03 (exe build missing pictures), and *Fix before handover* 3, 8.
- F2 covered in section 4 (hands off, don't cover LedgerPro), E12, and *Fix before handover* 6.
- F3 covered in section 3 (100% scale, 1920 x 1080), E03, E07, E08, section 8 (20 s / 15 s / 10 s limits), and *Fix before handover* 7.
- F4 covered in section 3 (statement rules with examples), E04, E10, E15, and *Fix before handover* 9.
- F5 covered in section 6 (Missing/Posted not confirmed) and *Fix before handover* 4.
- F6 covered in E08 (check LedgerPro before re-running), E11, and *Fix before handover* 4, 5.
- F7 covered in section 6: no business exception is shown as success, but "Missing" is the label for successfully posted lines, which is misleading. *Fix before handover* 10.
- F8 not applicable: the bot has no auto-rerun loop and no watchdog; each button wait ends after 20 s.
- F9 covered in section 4 (how to stop; closing LedgerPro doesn't stop it) and *Fix before handover* 6.
- F10 not applicable: there are no batches, locks or completion gates. Each run is independent and nothing blocks the next one. The "was run" marker file the bot writes is never read.
- F11 covered in section 5 (only the Reconcile file is visible to ops), E01-E05, and *Fix before handover* 1, 2.
- F12 covered in section 10, E13, E14, and *Fix before handover* 11, 12.
## 13. Fix before handover (dev team)
| # | Gap | Why it hurts ops | Where (file:line) |
|---|---|---|---|
| 1 | Crashes (no statement argument, missing shortcut, Export not found, bad amount, missing folder, failsafe) are not logged and leave no result file. Results are saved only at the end. | Ops sees "no file" with no reason; lines already posted aren't recorded anywhere | `app.py:73-97` (single `out.save` at `:96`) |
| 2 | The per-line log, the "not found" screenshots and the run summary (printed to stdout, which the launcher never captures) all sit where ops has no access. The screenshot has one fixed name per button and is overwritten. | Ops has only the Reconcile file; the cause stays hidden | `app.py:24`, `:45`, `:97` |
| 3 | `logs/`, `data/` and `data/output/` are never created; a missing `logs/` crashes both exes at import | Fresh install fails, or fails after all posting is done | `app.py:24`, `:45`, `:96`; `launcher.py:9` |
| 4 | "Posted" is written after clicking Save, with no check that LedgerPro saved | A Missing/Posted line may not be in LedgerPro | `app.py:65-70`, `:90` |
| 5 | A Save miss leaves the typed form open; the next line types on top of it | One Error can corrupt the next entry | `app.py:65-70`, `:91-92` |
| 6 | No window focus or "is LedgerPro in front" check before typing; no Stop button; closing LedgerPro doesn't stop the bot | Keystrokes land in other windows | `app.py:66-69` |
| 7 | Fixed sleeps (15 s / 10 s) instead of waiting for LedgerPro and the export; nothing checks the export file is fresh or where LedgerPro saves it | Old export means double posting (E11) | `app.py:76-79`, docstring `:50` |
| 8 | Scaling fix is a comment only: no DPI/resolution check at start. Exe build spec is all comments (`datas` commented out). Only `RuntimeError` is caught; newer pyautogui raises its own not-found error and `requirements.txt` is unpinned. | Any scale change or new build breaks every run | `app.py:20`, `:40`, `:91`, `:102`; `ledgerbot.spec:1-3`; `requirements.txt` |
| 9 | Duplicate references silently overwritten; references not trimmed or normalised; non-numeric amount crashes the run | Lines vanish, or are posted twice | `app.py:52`, `:81` |
| 10 | Result "Missing" is kept for lines that were successfully posted; a status like "Posted" would read correctly. The note "Not in LedgerPro - posting" is never shown. | Ops reads done lines as problems | `app.py:58`, `:87-92` |
| 11 | Launcher swallows every update error (incl. the self-signed certificate) with no log; download/unzip unprotected; no checksum; `!=` accepts downgrades; extracts over the running folder | Laptops silently stay old, or the launcher crashes | `launcher.py:15-30` (fix commit only added comment `:35`) |
| 12 | The version is not shown anywhere ops can see (the comment says window title, but the bot has no window); not in the log or the result file | Ops can't confirm an update | `app.py:15` |
| 13 | Two runs in the same minute overwrite each other's result file | A result file is lost | `app.py:96` |
| 14 | `.env` holding LedgerPro credentials and a log file containing business data are committed to git; `.env` is never read by the code | Credential and data exposure | `.env`, `logs/ledger_20260905.log` |
| 15 | The log note can carry counterparty names (seen in the committed log, from an older build) | Business data in logs | `logs/ledger_20260905.log` |