Files
Rpa_Skills/tests/evals/results/handoff/h-packaged-desktop-screens-r2.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

184 lines
22 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 reconciles the day's bank statement against LedgerPro, the desktop accounting app. You give it the bank statement Excel. It opens LedgerPro, exports LedgerPro's entries to Excel, and compares each reference and amount in the statement with that export. When a statement entry is not in LedgerPro, the bot creates it in LedgerPro (New Entry → reference → amount → Save). When the amounts differ, it only reports the difference. The output is one Excel file per run, `Reconcile_<date>_<time>.xlsx`, in the output folder. The bot runs once per statement, whenever ops starts it. It drives one app: **LedgerPro**. It finds LedgerPro's buttons by matching pictures of them on the screen.
## 2. How it works
```
launcher.exe (what you start)
├─ checks for an update → installs it into the bot folder
└─ starts → LedgerBot.exe ──drives (mouse + keyboard)──> LedgerPro
│ (do not touch while it runs)
├─ reads → your bank statement Excel
├─ reads → LedgerPro's export file
└─ writes → data\output\Reconcile_<date>_<time>.xlsx (at the very end only)
```
- **launcher.exe** checks the update server for a new version, installs it if there is one, then starts the bot. It does not wait for the bot or tell you whether the bot succeeded.
- **LedgerBot.exe** is the bot itself. It has **no window of its own**: no screen, no progress bar, no Stop button. All you see is LedgerPro being driven.
- **LedgerPro** is the accounting app. The bot clicks its buttons and types into its forms, so the mouse and keyboard belong to the bot during a run.
- **The output file** is written only when the bot has gone through every row. If no new file appears, the run did not finish.
**One run, step by step:**
1. The launcher checks for an update and starts the bot.
2. The bot opens LedgerPro from the `LedgerPro` shortcut on the Desktop, then waits 15 seconds.
3. It clicks LedgerPro's Export to Excel button, then waits 10 seconds for the export.
4. It reads the export and your bank statement.
5. It goes through the statement row by row: matching amount → OK; different amount → Mismatch; not in LedgerPro → it posts the entry.
6. It writes the output file to the output folder.
## 3. Before a run
- [ ] **Windows display scaling is 100%** and the screen resolution is **1920 x 1080** (Settings → System → Display). The button pictures were taken at that setting. At 125% the bot cannot find the buttons. Nothing checks this for you.
- [ ] LedgerPro's shortcut, named exactly `LedgerPro`, is on your Desktop or the Public Desktop. Without it, LedgerPro never opens (E01).
- [ ] LedgerPro opens fully within 15 seconds on this machine, with no login box, update prompt or popup in front. The bot does not handle popups.
- [ ] LedgerPro's export saves to the bot's usual export location (as set up by dev). The bot does not check that the export file is from today (E08).
- [ ] Only one monitor is in use, or LedgerPro is on the main monitor. The bot only looks at the main screen.
- [ ] Bank statement Excel, first sheet:
- Row 1 is a header. Data starts on row 2.
- Column A = reference, column B = amount. Nothing else is read.
- **Every row with a reference must have an amount, as a real number.** An empty amount or text like `1,200.00 CR` stops the whole run (E09).
Bad: `TX-1001 | (blank)` · Good: `TX-1001 | 1200.00`
- **Each reference once.** If a reference appears twice, only the last row is used and the other is silently dropped.
- Type references as text, exactly as LedgerPro shows them. A reference typed as a plain number can be read as `1001.0` and will not match LedgerPro's `1001`.
Bad: `1001` stored as a number · Good: `1001` stored as text (or `TX-1001`)
- Use only plain English letters, digits and punctuation in references. The bot cannot type accented or other special characters.
- [ ] Start the run by **dragging the statement Excel onto `launcher.exe`** (or the shortcut ops was given). Starting it without a file does nothing visible and produces no output.
- [ ] Version check: the bot has no screen that shows its version today (see section 10). Ask dev to confirm the version after each release.
## 4. During a run
- **Hands off the mouse and keyboard** for the whole run. The bot types into whatever window has focus. If you click elsewhere, it types references and amounts into that window.
- Do not open or move other windows over LedgerPro. A window covering a button makes the bot fail that row.
- **Do not move the mouse into a corner of the screen.** That is the emergency stop: the bot stops at once and **writes no output file**, but anything it already posted stays posted in LedgerPro.
- **To stop the bot:** there is no Stop button. Move the mouse into a corner of the screen, or end `LedgerBot.exe` in Task Manager. Closing LedgerPro does **not** stop the bot. After stopping, do the checks in E07 before running again.
- **How long a run takes:** about 30 seconds of start-up, then a few seconds per posted entry. Every row that fails costs an extra 20 seconds or more. If one Save fails, the following rows often fail too (E04), so a run with many failures can take a long time. There is no watchdog. If LedgerPro has shown no movement for more than 2 minutes and no output file has appeared, stop the bot as above and follow E07.
## 5. Where to look when something goes wrong
Ops can open the output folder and the output files only. The bot has no screens of its own, and the log folder is not open to ops (see *Fix before handover*).
| Question | Where to look |
|---|---|
| Did the run finish? | Output folder `data\output\`: is there a new `Reconcile_<date>_<time>.xlsx` with the time of this run? No new file = the run did not finish (E01, E02, E07, E09). |
| Which items failed? | The output file, **Result** column = `Error`. Also check `Mismatch` rows: they need a person. |
| Why did one item fail? | The output file, **Note** column of that row. Then look at LedgerPro itself. |
| Was an entry really posted? | Only LedgerPro can tell you. The bot writes `Posted` after clicking Save, without checking (E05). |
| Did the bot already retry? | It never retries an item or a run. It only searches for a button for 20 seconds before giving up on that row. |
| Which version is running? | Not visible to ops today. Ask dev (section 10). |
## 6. Statuses
The output file has no colours. Statuses are the text in the **Result** and **Note** columns.
| Result | Note | Meaning | What ops does |
|---|---|---|---|
| `OK` | (empty) | The reference is in LedgerPro with the same amount (within 1 cent). | Nothing. |
| `Missing` | `Posted` | The reference was not in LedgerPro, and the bot entered it and **clicked Save**. Despite the word "Missing", the bot **believes it posted the entry**. It did **not** check that the save worked. | Spot-check a few in LedgerPro. Check all of them if any Save-related errors appear in the same run (E04, E05). |
| `Mismatch` | `LedgerPro has <amount>` | The reference exists in LedgerPro with a different amount. **The bot changed nothing.** | **Needs follow-up.** Investigate and correct by hand in LedgerPro (E06). |
| `Error` | `Button new_entry.png not found on screen` | The bot could not find LedgerPro's New Entry button. Nothing was entered for this row. | E03. |
| `Error` | `Button save_btn.png not found on screen` | The bot typed the entry but could not find the Save button. The entry is **most likely not saved**, and the form may still be open. | E04. |
| (no output file) | - | The run stopped before the end. Nothing is recorded for any row, even rows already posted. | E07. |
`Not in LedgerPro - posting` is a note the bot sets internally before posting. It is always replaced, so you will never see it in the output.
## 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 | LedgerPro never opens; no output file appears | It looks for a shortcut named `LedgerPro` on your Desktop and the Public Desktop. If neither has one, it stops at once. | Nowhere ops can see. No output file. | System | Ops | Put the `LedgerPro` shortcut on the Desktop (exact name), then run again. | The shortcut is there and LedgerPro still does not open. |
| E02 | LedgerPro opens, but nothing is clicked; no output file appears | After 15 s it looks for the Export to Excel button for 20 s. If it never matches the button picture, it stops the run. | Nowhere ops can see. No output file. | System | Ops, then Dev | Check scaling is 100% and resolution 1920 x 1080; close any popup or login box in LedgerPro; make sure LedgerPro is maximised on the main screen; run again. | It still happens with the right settings, or it happens on a fresh install or right after an update (the button pictures may be missing from the build, see incident #3). |
| E03 | Result `Error`, Note `Button new_entry.png not found on screen` | When posting, it looks for the New Entry button for 20 s and gives up on that row. | Output file, Result and Note | System | Ops | Check scaling and popups as in E02. Check in LedgerPro that the reference is not there, then run again with the statement. | Several runs in a row fail this way with correct settings. |
| E04 | Result `Error`, Note `Button save_btn.png not found on screen`, often followed by more Errors on later rows | It clicked New Entry and typed the reference and amount, then looked for Save for 20 s and gave up. It does not close the half-filled form, so later rows may type into the wrong place. | Output file, Result and Note | System | Ops | 1. In LedgerPro, close any open New Entry form without saving. 2. **Search LedgerPro for each Error reference and for the `Missing / Posted` rows after it**, to see what was really saved. 3. Fix or delete stray entries by hand. 4. Run again. | It happens again after a clean restart with correct settings. |
| E05 | Result `Missing`, Note `Posted`, but the entry is not in LedgerPro or has the wrong amount | The bot writes `Posted` as soon as it clicks Save. It does not check for a save confirmation, a validation message, or that the typed text landed in the right fields. | Output file says `Posted`; the truth is only in LedgerPro | System | Ops | **Check in LedgerPro before re-running.** Enter or correct the entry by hand, or run again with a statement holding only the missing rows. | More than one or two per run, or wrong amounts typed. Send the output file. |
| E06 | Result `Mismatch`, Note `LedgerPro has <amount>` | The reference is in LedgerPro, but the amounts differ by more than 1 cent. | Output file, Result and Note | Business | Ops | Find out which amount is right (statement or LedgerPro) and correct it by hand. The bot never changes existing entries. | Never for dev, unless the amounts are clearly read wrongly (e.g. every row mismatches). |
| E07 | The run stops midway: LedgerPro stops moving and no output file appears | Any unexpected problem stops the whole run: the mouse touched a screen corner, an amount could not be read, an unexpected error in LedgerPro. Nothing is recorded. | Nowhere. No output file, even for rows already posted. | System | Ops, then Dev | 1. **Do not re-run straight away.** 2. In LedgerPro, close any open form. 3. Check which statement references are already in LedgerPro. 4. Check the statement against the input rules in section 3. 5. Run again. | It stops again with a clean statement and nobody touching the machine. |
| E08 | Many rows `Missing / Posted` that were already in LedgerPro, or duplicate entries in LedgerPro after a run | The bot reads the last export file 10 s after clicking Export. If the export was slower, or saved elsewhere, it reads an older export without noticing. | Output file looks normal; duplicates only show in LedgerPro | System | Dev | Remove the duplicate entries in LedgerPro by hand. Do not run again until dev has checked the export. | Always. |
| E09 | No output file, right after LedgerPro exports | The bot could not read the statement: an empty or text amount, no file given, or the file is not an Excel workbook. | Nowhere. No output file. | Business | Ops | Fix the statement as per section 3 (every amount a number, one reference per row), then run again. | The statement is clean and it still fails. |
| E10 | A row you expected is missing from the output file | The statement had the same reference twice. The bot keeps only the last one. | Not recorded | Business | Ops | Remove duplicates from the statement, or post the dropped row by hand. | - |
| E11 | Text appears in another window; references or amounts typed in the wrong place | Someone used the mouse or keyboard, or another window came in front. The bot types into whatever has focus. | Not recorded | System | Ops | Undo the stray typing. Check LedgerPro for half-entered entries. Run again hands-off. | - |
| E12 | After a release, this machine behaves like the old version | The launcher could not reach the update server (offline, or the server's certificate is not trusted on this machine). It ignores the problem and starts the old version. | Not recorded | System | Dev | Raise a ticket so dev can check the version and update this machine. | Always, after every release where behaviour does not change. |
| E13 | Double-clicking the launcher does nothing; the bot never starts | The update download or install failed, and the launcher stopped before starting the bot. | Not recorded | System | Dev | Raise a ticket. Do not copy files into the bot folder yourself. | Always. |
## 8. What the bot recovers by itself
Very little. Ops should not expect it to fix anything on its own.
| Problem | What the bot does | Limit | After the limit |
|---|---|---|---|
| A button is not on screen yet | Looks for it once a second | 20 s per button | Export button: the whole run stops (E02). New Entry or Save: that row is `Error`, next row (E03, E04). |
| LedgerPro is slow to open | Nothing; it simply waits | Fixed 15 s | Same as above. |
| Export is slow | Nothing; it simply waits | Fixed 10 s | Reads whatever export file is there (E08). |
| Update server unreachable | Starts the old version without telling you | 10 s | Old version keeps running (E12). |
| Anything else | No retry, no restart, no resume | - | Run stops with no output file (E07). |
## 9. Known incidents
| When / version | What ops saw | Cause | What to do now | Ops could handle? |
|---|---|---|---|---|
| Up to v3.2.0 (#3) | The packaged bot failed at its very first button on every machine | The button pictures were left out of the packaged build | Dev says this is fixed, but the current build file does not show it. If the bot fails at the first button on a fresh install or after an update, raise a ticket (E02). | No |
| Up to v3.2.0 (#2) | Rows `Error` "Button save_btn.png not found on screen" on some laptops | Laptops at 125% display scaling. The button pictures only match at 100%. | Keep scaling at 100% and resolution 1920 x 1080 (section 3). Check this first for any "not found" error. | Yes |
| Up to v3.2.0 (#1) | Two laptops stayed on the old version after a release; no error | The launcher could not trust the update server's certificate and quietly ran the old version | Still possible: the code still hides this. After each release, ask dev to confirm every machine's version (E12). | Partly |
## 10. Releases and version check
- **How an update arrives:** each time you start `launcher.exe`, it asks the update server for the latest version. If it differs, it downloads it and installs it into the bot folder, then starts the bot.
- **How to confirm it applied:** ops cannot see the version today. The bot has no window or title bar. Ask dev to confirm through the RPA Support ticket after each release.
- **If the version did not change** (behaviour after a release is unchanged): raise a ticket (E12). Do not copy files into the bot folder by hand.
- All machines should run the same version, so that results from different machines are comparable.
## 11. Escalating to dev
Raise a ticket in the **RPA Support** queue. Send:
- the exception ID from section 7 (e.g. E04),
- the machine name and the date and time the run started,
- the file name of the bank statement used (not its contents in chat),
- the output file `Reconcile_<date>_<time>.xlsx`, if one was produced, or "no output file",
- the Result and Note of the failing rows,
- what LedgerPro showed at the time (a description, or a screenshot that shows no customer data).
Dev collects the bot's own log and "not found" screenshots from the machine; ops does not have access to them.
Never send: passwords, the bot's settings files, or customer or account data in chat.
## 12. Failure-class check
- **F1** missing prerequisite: covered in section 3 (shortcut, scaling, single screen) and E01, E02, E13; required folders and build contents in *Fix before handover* #9, #11.
- **F2** wrong window or focus: covered in section 4 (hands off, nothing over LedgerPro) and E11. The bot does not look for windows by title; it clicks wherever the button picture matches on the main screen.
- **F3** target app slower or different: covered in E02, E03, E04, section 8 (fixed 15 s and 10 s waits, 20 s per button) and section 3 (scaling, resolution, popups); *Fix before handover* #2, #6.
- **F4** input read differently: covered in section 3 input rules, E09, E10; *Fix before handover* #10.
- **F5** marked done when nothing was done: covered in E05 and E08; *Fix before handover* #1, #2.
- **F6** action happened but not confirmed: covered in E04, E05 and E07 (check in LedgerPro before re-running); *Fix before handover* #1, #5.
- **F7** business exception shown as success: covered in section 6. `Mismatch` needs follow-up but has no colour, and posted rows keep the result `Missing`; *Fix before handover* #7.
- **F8** endless re-runs or watchdog: covered in section 4. The bot has no re-runs and no watchdog, so a hung run has no time limit; *Fix before handover* #3.
- **F9** stopping the wrong way: covered in section 4 (corner or Task Manager; closing LedgerPro does not stop it) and E07.
- **F10** one stuck item blocks the queue: covered in E04. A failed Save leaves the form open and later rows fail too. There are no batches or locks between runs; *Fix before handover* #5.
- **F11** cause hidden from ops: covered in section 5. Crash reasons, the log and the screenshots are not reachable by ops; *Fix before handover* #3, #4, #8.
- **F12** update did not arrive: covered in section 10, E12, E13 and incident #1; *Fix before handover* #12, #13, #14.
## 13. Fix before handover (dev team)
| # | Gap | Why it hurts ops | Where (file:line) |
|---|---|---|---|
| 1 | `Posted` is written as soon as Save is clicked; no save confirmation or check that the entry exists | Ops trusts entries that may not be in LedgerPro (E05) | `app.py:65-70`, `app.py:89-90` |
| 2 | Fixed sleeps for LedgerPro start (15 s) and export (10 s); the export file's date is never checked | A slow export means an old export is read, giving false `Missing` rows and duplicate posts (E08) | `app.py:75-79` |
| 3 | Output is written only at the end; a crash leaves no file and no reason anywhere; no watchdog | Ops cannot tell what was posted before a crash (E07) | `app.py:82-96`, `app.py:100-101` |
| 4 | Only one error type is caught per row; any other error (fail-safe corner, bad amount, image-library exception) ends the run | One bad row loses the whole run's results | `app.py:91`, `app.py:52`, `app.py:81` |
| 5 | After "Save not found" the half-filled form is left open; no reset before the next row | One failure spreads to later rows (E04) | `app.py:65-70`, `app.py:88-92` |
| 6 | No check of display scaling or resolution at start; images match only at 100% / 1920x1080 | Wrong setting shows up as many 20 s failures | `app.py:20` |
| 7 | Rows the bot posted keep Result `Missing`; nothing in the file is coloured; `Mismatch` is not flagged as needing follow-up | Ops reads `Missing` as "not done" and may post twice | `app.py:58`, `app.py:87-94` |
| 8 | The log and "not found" screenshots are in the log folder, which ops cannot open. Screenshots overwrite each other (no time or reference in the name) and may show customer data. All lines are INFO, with no start, end or error lines. The run summary goes only to the console. | Ops has no way to see the cause beyond the Note column | `app.py:24-25`, `app.py:45`, `app.py:95`, `app.py:97` |
| 9 | `logs\` and `data\output\` must already exist; missing `logs\` crashes at start, missing `data\output\` crashes after all posting | All posting done, no record of it | `app.py:24`, `app.py:96` |
| 10 | Statement input not validated: empty or text amount crashes the run; duplicate references silently collapse; numeric references become `1001.0`; no file argument crashes; non-ASCII cannot be typed | Silent skips and lost runs (E09, E10) | `app.py:81`, `app.py:67`, `app.py:101` |
| 11 | The build spec is only comments; the line that bundles the button pictures is commented out. The "assets missing" fix commit is not in the code. | A rebuild brings back incident #3 | `ledgerbot.spec:1-3` |
| 12 | The launcher still hides every update error (offline, SSL, bad reply). The "SSL error" fix commit only added a comment. | Machines stay on old versions unnoticed (E12) | `launcher.py:15-20`, `launcher.py:35` |
| 13 | The launcher compares versions with "not equal" and its own version is fixed at build time, so it can reinstall on every start, or install an older version. No checksum on the download; `update.zip` is left behind. | Slow starts, wrong versions, launcher crash (E13) | `launcher.py:9`, `launcher.py:25-29` |
| 14 | No visible version. The comment says the window title shows "LedgerBot v3.2.0", but there is no window. | Ops cannot do a version check (section 10) | `app.py:15` |
| 15 | No guard against posting twice when a run is repeated after a crash or with an old export | Duplicate entries in LedgerPro | `app.py:86-92` |
| 16 | Library versions are not pinned; newer versions of the image library raise an error instead of "not found", which would crash runs on any missing button | A rebuild can change behaviour silently | `requirements.txt` |
| 17 | The marker file `BOT_WAS_RUN` is written at start but never read | None today; misleading if someone relies on it | `app.py:74` |