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>
18 KiB
Payer portal downloader - ops handover
Version: not versioned (see section 10) · Written 2026-10-23 · Escalation: raise a ticket in the RPA Support queue
1. What the bot does
Every day at 07:00, Windows Task Scheduler starts the bot. It signs in to the payer web portal and downloads each provider's remittance report as a CSV file. It reads the input Excel file data/input/providers.xlsx. The Login sheet holds the portal username and password, and the Providers sheet lists one provider per row (NPI, name, active flag). The bot produces:
- one CSV per provider in
data/downloads/ - a daily result file,
data/output/Download_Report_<YYYYMMDD>.xlsx, with one row per provider (Provider, NPI, Status, Remarks) - a screenshot in
data/screens/<NPI>.pngwhen a provider's report page fails to load
It drives one app: a Google Chrome window that it opens itself.
2. How it works
Windows Task Scheduler (07:00 daily)
└─ starts → Downloader (no window of its own) ──drives──> Chrome → payer portal
│ (do not touch while it runs)
├─ saves → data/downloads/*.csv (the downloaded reports)
├─ saves → data/screens/<NPI>.png (only when a page fails to load)
└─ saves → data/output/Download_Report_<YYYYMMDD>.xlsx (at the very end)
- Task Scheduler starts the bot at 07:00. Nothing appears on screen except Chrome.
- The downloader runs in the background. It has no window, no Stop button and no progress display.
- Chrome is opened and closed by the bot. Chrome shows a bar saying it is controlled by automated software. That is the bot's window.
- The result file is written only once, when the run ends. It does not exist while the run is still going.
One run, step by step:
- Read the input Excel (Login and Providers sheets).
- Open Chrome and sign in to the portal.
- For each provider row:
- If the provider is marked inactive, skip it.
- Otherwise open its remittance page, wait for the report table, click "export CSV" and wait for the file to arrive.
- Close Chrome and save the result file.
3. Before a run
- Google Chrome is installed and opens normally on the bot machine. If Chrome can't start, no result file is produced for the day (E02).
- These folders exist inside the bot folder:
data/input,data/downloads,data/screens,data/outputandlogs. The bot does not create them. What happens when one is missing:data/outputmissing: the whole day's result file is lost (E02).data/screensmissing: screenshots are silently not saved.logsmissing: the bot does not start at all (E02).
- The input file is at
data/input/providers.xlsx. The scheduled task points at this path. - Login sheet: the username is in cell A2 and the password is in cell B2. When the portal password changes, update B2 before 07:00, or every row will say Login Failed (E01).
- Providers sheet, from row 2:
- column A = NPI, column B = provider name, column C = active flag
- one provider per row
- a row with an empty NPI cell is ignored, with no row in the result file
- Active flag, column C: only a capital N marks a provider inactive.
- Good:
N - Bad:
n,No, orNwith a space. These are treated as active, and the bot will try to download that provider.
- Good:
- Don't keep files open or move files inside
data/downloadsaround 07:00. The bot decides a download worked when any new CSV appears in that folder (E10).
4. During a run
- Don't use, close or click in the Chrome window the bot opened. Closing it stops the run part-way (E03).
- Don't open the result file for today until the run has ended. It is written only at the end.
- To stop the bot: end the task "Payer portal downloader" in Task Scheduler. If you don't have Task Scheduler access, raise an RPA Support ticket.
- Stopping this way skips the final save, so no result file is written for that run.
- Close any Chrome window the bot left behind.
- When a run looks stuck: Chrome stays on the same portal page for more than 10 minutes, or today's result file has still not appeared well after the run should have finished (allow about 2 minutes per provider).
- The bot has no watchdog. It does not restart itself.
- If Chrome is frozen on one page for more than 10 minutes, raise a ticket.
5. Where to look when something goes wrong
| Question | Where to look |
|---|---|
| Did the run finish? | data/output/Download_Report_<today's date>.xlsx exists, and its row count (not counting the header) equals the number of providers in the input with an NPI. Fewer rows means the run stopped part-way (E03). No file means the run failed or never started (E02). |
| Which providers failed? | Result file, Status column: red cells (Error). Rows with Login Failed have no colour, so check that text too. Green "Downloaded" rows can also be failures; read the Remarks (E07). |
| Why did one provider fail? | Result file, Remarks column, same row. For "Report grid did not load", open data/screens/<NPI>.png. |
| Is the downloaded file there? | data/downloads/. The files keep the portal's own names, so match them by the time they were saved, not by name. |
| Did the bot already retry? | Only session expiries are retried (up to 3 attempts per provider). The retry is recorded only in the bot's log, which ops can't open. If you need to know, ask in the ticket. |
| Which version is running? | The bot has no version number (see section 10). |
6. Statuses
These are the values in the result file's Status column, each with its Remarks text.
| Status (Remarks) | Colour | Meaning | What ops does |
|---|---|---|---|
| Downloaded ("Report saved") | green | A new CSV appeared in data/downloads after the export click |
Nothing. If CSV counts don't match, see E10. |
| Downloaded ("portal maintenance - no file") | green | Not downloaded. The portal showed a maintenance banner, so no file was saved. | Needs follow-up: re-run or download by hand after maintenance (E07) |
| No Data ("No remittances in the date range") | green | The portal had no remittances for this provider | Nothing |
| Skipped - inactive provider ("Marked N in the input") | green | Column C was a capital N, so the bot did not open this provider | Nothing, unless the provider should be active: fix column C |
| Error ("Report grid did not load") | red | The provider's report table didn't appear within 30 seconds. A screenshot was taken. | E04 |
| Error ("Download did not finish") | red | The export was clicked but no new CSV arrived within 60 seconds | E05 |
| Error ("Session expired") | red | The portal kept logging the bot out, 3 attempts in a row | E06 |
| Login Failed ("Check the portal username/password") | no colour (should be red) | The first sign-in failed. Every row gets this status and nothing is downloaded. | E01 |
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 | Every row says Login Failed, "Check the portal username/password". No colour. Nothing downloaded. | After sign-in it waits 30 s for the portal dashboard. If the dashboard never appears, it marks every provider Login Failed and stops. | Result file, every row | Business (wrong or expired credentials) or System (portal slow or down) | Ops | Sign in to the portal by hand with the username and password from the Login sheet (A2/B2). If that fails, fix the credentials in the input. Then ask for a re-run. | Manual sign-in works but the bot still gets Login Failed. Send the date and the result file. |
| E02 | No result file for today in data/output |
The run stopped before it could save. Causes: Chrome couldn't start; the input file is missing or unreadable; the data/output or logs folder is missing; the task was ended in Task Scheduler. |
Nowhere ops can see. The error is not written to any file. | System | Ops, then Dev | Check that the folders in section 3 exist and that data/input/providers.xlsx is there and not open in Excel. Then ask for a re-run. |
The folders and input are fine and there is still no file. Send the date, the expected run time (07:00), and whether Chrome opened. |
| E03 | The result file has fewer rows than the input. The last providers are simply missing. | The run stopped part-way. Causes: a re-login failed; a page element was missing (sign-in fields or the export button); the Chrome window was closed; a page hung. The bot saves what it had and stops. | Result file (missing rows). The cause is not recorded anywhere ops can see. | System | Dev | Note which provider is the first missing one: that is where it stopped. Ask for a re-run. A re-run processes every provider again and replaces today's result file. | Always. Send the date, the result file, and the first missing provider's NPI. |
| E04 | Error, "Report grid did not load" | It opens the provider's page and waits 30 s for the report table. If the table never appears, it saves a screenshot and moves on. | Result file; screenshot data/screens/<NPI>.png |
System (portal slow) or Business (NPI not on this portal account) | Ops | Open the screenshot. If it shows "not found" or "no access", check the NPI in column A. If the page was just slow, download that provider by hand or ask for a re-run. | The same provider fails on 2 days in a row with a correct NPI. Send the date, the NPI and the screenshot. |
| E05 | Error, "Download did not finish" | It clicks export and watches data/downloads for 60 s for any new CSV. If none appears, it moves on. No screenshot. |
Result file | System | Ops | Check data/downloads first. The file may have arrived late, and it may then have been counted as the next provider's download (E10). If it is not there, download it by hand. Re-running is safe: downloads change nothing in the portal. |
It happens for several providers in one run, or every day. Send the date and the NPIs. |
| E06 | Error, "Session expired" | Opening the provider's page sent it back to the sign-in page. It signs in again and retries, up to 3 attempts. | Result file. The retries are only in the bot's log. | System | Bot, then Ops | Download that provider by hand or ask for a re-run. | It appears on more than one provider in a run, or on 2 days in a row. Send the date and the NPIs. |
| E07 | Green Downloaded, but Remarks say "portal maintenance - no file" | The portal page showed a maintenance banner. The bot records it as Downloaded and moves on. | Result file, Remarks column only | System (portal side) | Ops | No file exists. After the maintenance ends, download by hand or ask for a re-run. | Maintenance shows for more than one day |
| E08 | No Data, "No remittances in the date range" | The portal's report page said there were no results | Result file | Business | Nobody | Nothing | A provider you know has payments shows No Data |
| E09 | Skipped - inactive provider, or an inactive provider was not skipped | Only a capital N in column C counts as inactive | Result file | Business | Ops | Fix column C: capital N for inactive, anything else for active | Never (input fix) |
| E10 | The number of new CSVs in data/downloads doesn't match the number of "Report saved" rows, or a CSV holds the wrong provider's data |
The bot counts any new CSV as success. It does not check which provider the file belongs to. A late file from one provider can be credited to the next. | Not recorded. Visible only by comparing files with the result file. | System | Ops, then Dev | Open the CSVs saved around that time and check which provider each belongs to. Download any missing provider by hand. | It happens again. Send the date and the provider rows involved. |
| E11 | Chrome sits on the same portal page for more than 10 minutes, and no result file yet | There is no watchdog. A hung page is not detected. | Nowhere | System | Dev | End the task (section 4), close Chrome, raise a ticket | Always. Send the date, the time and a photo or screenshot of the Chrome window. |
8. What the bot recovers by itself
| Problem | What the bot does | Limit | After the limit |
|---|---|---|---|
| Portal logged the bot out (session expired) | Signs in again and retries the same provider | 3 attempts per provider (30 s wait for each sign-in) | Row = Error "Session expired", next provider. If one of those sign-ins fails outright, the run stops (E03). |
| Report table didn't load | Nothing. No retry. | 30 s, once | Row = Error, screenshot, next provider |
| Download didn't arrive | Nothing. No retry. | 60 s, once | Row = Error, next provider |
| Anything else (Chrome closed, page element missing, page hung) | Nothing. No restart, no resume. | none | Run stops; result file saved with the rows done so far (E03) or not at all (E02, E11) |
Timing: one provider normally takes seconds. A failing one takes up to about 2 minutes before the bot gives up. No retry happens later in the day. The next automatic attempt is tomorrow's 07:00 run.
9. Known incidents
There is little history: one log of one run, and no change log.
| When / version | What ops saw | Cause | What to do now | Ops could handle? |
|---|---|---|---|---|
| 2026-09-02, unversioned | 1 of 3 providers red "Error"; the other 2 Downloaded | The portal session expired during the run. The bot signed in again once and the retry failed. Whether it was a slow table (E04) or a slow download (E05) is only in the Remarks column. | Read Remarks, follow E04 or E05 | Partly |
10. Releases and version check
- How an update arrives: there is no updater. A developer replaces
bot.pyin the bot folder by hand. - How to confirm it applied: not possible today. The bot shows no version number anywhere (see section 13).
- If you think an update did not arrive: raise an RPA Support ticket.
11. Escalating to dev
Raise a ticket in the RPA Support queue.
Send:
- the run date and time (07:00 unless re-run)
- the exception ID from section 7 (e.g. E04)
- the NPI(s) affected
- today's result file
data/output/Download_Report_<YYYYMMDD>.xlsx - any
data/screens/<NPI>.pngfor those NPIs
Ask dev to check the bot's log for that date, because ops can't open it.
Never send: the portal password, the input file's Login sheet, the settings file config.yaml, or downloaded CSV contents in chat.
12. Failure-class check
- F1 covered in section 3 (Chrome, folders, input path) and E02.
- F2 covered in section 4 (don't touch the bot's Chrome window). The bot opens its own Chrome, so it can't grab another window.
- F3 covered in E01, E04, E05 and E11, with limits in section 8.
- F4 covered in section 3 (active flag, empty NPI, Login cells) and E09; fix item 8.
- F5 covered in E07 and E10; fix items 1 and 2.
- F6 covered in E05: the file may arrive after the bot gave up. Re-running is safe because downloads don't change the portal.
- F7 covered in section 6 ("portal maintenance" is green) and E07; fix item 1.
- F8 covered in section 8 and E11. There is no auto-rerun loop. There is no watchdog: fix item 10.
- F9 covered in section 4 (end the task in Task Scheduler; no result file is saved then); fix item 10.
- F10 not applicable: the bot has no batch or completion gate. Each provider row is independent, and every run starts from scratch.
- F11 covered in section 5 (the log is not open to ops); fix items 3, 4, 5 and 7.
- F12 covered in section 10; fix item 9. There is no updater and nothing shared is rewritten on start.
13. Fix before handover (dev team)
| # | Gap | Why it hurts ops | Where (file:line) |
|---|---|---|---|
| 1 | Maintenance banner returns status "Downloaded" (green) with no file | Ops thinks the report was downloaded | bot.py:54-55 |
| 2 | Download success = "any new *.csv in the folder". Files are not renamed per provider. |
A late file is credited to the wrong provider; CSVs can't be tied to an NPI | bot.py:63-68 |
| 3 | Uncaught errors (failed re-login, missing sign-in fields or export button, Chrome failure, page-load timeout) stop the run. Remaining providers get no row, and no reason is recorded. | Result file looks complete but is short (E03) | bot.py:41-43, bot.py:64, bot.py:81, bot.py:102, bot.py:113-114 |
| 4 | Crashes and tracebacks are not written to logs/bot.log, only to the console, which Task Scheduler doesn't keep |
No record anywhere of why a run died (E02, E03) | bot.py:30-31, bot.py:113-114 |
| 5 | Login Failed rows get no colour and no log line | Easy to miss; the log shows nothing for that day | bot.py:88-91 (colour map bot.py:27-28 is never applied there) |
| 6 | Folders data/downloads, data/screens, data/output and logs are never created. A missing data/output loses the report in the final save; a missing data/screens loses screenshots silently. |
Whole day's result lost (E02) | bot.py:20-21, bot.py:30, bot.py:59, bot.py:110 |
| 7 | Retries and the Remarks reason are only in the log (or not logged at all). The session-expiry warning has no NPI. | Ops can't open the log, so "did it retry?" can't be answered. Suggest an Attempts column in the result file. | bot.py:101, bot.py:105 |
| 8 | Active flag: only exact capital "N" is inactive | n / No / blank-padded values get processed |
bot.py:77 |
| 9 | No version string anywhere | Ops can't confirm which build runs | bot.py:1-2 |
| 10 | No watchdog, no page-load timeout, no Stop mechanism that still saves the result file | Hung runs go unnoticed; stopping loses the day's result file | bot.py:79-81, bot.py:108-110 |
| 11 | A re-run reprocesses every provider and overwrites the day's result file; no resume | A re-run for one failed provider redoes all and erases the earlier result | bot.py:92, bot.py:110 |
| 12 | Security: portal password kept in the input Excel; an unused API token in plain text in config; provider names written to the log; screenshots may show patient data | Credential and PHI exposure | bot.py:76, config.yaml:2, bot.py:105, bot.py:59 |
| 13 | After the third failed attempt the bot signs in once more for nothing | Wasted 30 s per such provider; one more chance to crash (E03) | bot.py:96-104 |