{"id":32,"date":"2026-03-25T14:08:46","date_gmt":"2026-03-25T13:08:46","guid":{"rendered":"http:\/\/serwer402453.lh.pl\/autoinstalator\/serwer402453.lh.pl\/wordpress143401\/?p=32"},"modified":"2026-05-07T21:49:27","modified_gmt":"2026-05-07T19:49:27","slug":"rpa-workflows","status":"publish","type":"post","link":"https:\/\/chmielinski-konrad.info\/index.php\/2026\/03\/25\/rpa-workflows\/","title":{"rendered":"RPA Workflows"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"pl\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>RPA Workflows &mdash; Konrad Chmielinski<\/title>\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n    <link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=JetBrains+Mono:wght@400;500;700&#038;family=Sora:wght@300;400;600;700&#038;display=swap\" media=\"print\" onload=\"this.media='all'\">\n    <noscript>\n        <link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=JetBrains+Mono:wght@400;500;700&#038;family=Sora:wght@300;400;600;700&#038;display=swap\">\n    <\/noscript>\n    <style>\n    :root {\n        --accent: #0F766E;\n        --accent-dim: #0D5C56;\n        --accent-bg: #CCFBF1;\n        --mono: 'JetBrains Mono', monospace;\n        --sans: 'Sora', sans-serif;\n    }\n\n    * {\n        box-sizing: border-box;\n        margin: 0;\n        padding: 0;\n    }\n\n    body {\n        background: #fff;\n        color: #111;\n        -webkit-overflow-scrolling: touch;\n        overflow-x: hidden;\n    }\n\n    .blog-root {\n        font-family: var(--sans);\n        color: #111;\n        max-width: 100%;\n        margin: 0 auto;\n        padding: 2rem 1rem 4rem;\n        line-height: 1.7;\n    }\n\n    .eyebrow {\n        font-family: var(--mono);\n        font-size: 11px;\n        letter-spacing: .12em;\n        color: var(--accent-dim);\n        text-transform: uppercase;\n        margin-bottom: .75rem;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n    }\n\n    .eyebrow::before {\n        content: '';\n        display: inline-block;\n        width: 24px;\n        height: 1.5px;\n        background: var(--accent);\n    }\n\n    h1.blog-title {\n        font-family: var(--sans);\n        font-size: 2.2rem;\n        font-weight: 700;\n        line-height: 1.2;\n        margin-bottom: .5rem;\n        color: #111;\n    }\n\n    .subtitle {\n        font-size: 1.05rem;\n        color: #555;\n        font-weight: 300;\n        margin-bottom: 1.75rem;\n    }\n\n    .meta-row {\n        display: flex;\n        align-items: center;\n        gap: 1rem;\n        padding: .75rem 0;\n        border-top: .5px solid #ddd;\n        border-bottom: .5px solid #ddd;\n        margin-bottom: 2rem;\n        flex-wrap: wrap;\n    }\n\n    .meta-chip {\n        font-family: var(--mono);\n        font-size: 11px;\n        background: #f4f4f2;\n        border: .5px solid #ddd;\n        border-radius: 4px;\n        padding: 3px 8px;\n        color: #555;\n    }\n\n    .meta-chip.teal {\n        background: var(--accent-bg);\n        color: var(--accent-dim);\n        border-color: #99F6E4;\n    }\n\n    .tech-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n        gap: 10px;\n        margin: 1.5rem 0 2rem;\n    }\n\n    .tech-card {\n        background: #fff;\n        border: .5px solid #ddd;\n        border-radius: 12px;\n        padding: .875rem 1rem;\n        position: relative;\n    }\n\n    .tech-card .tc-label {\n        font-family: var(--mono);\n        font-size: 10px;\n        color: #777;\n        letter-spacing: .08em;\n        text-transform: uppercase;\n        margin-bottom: 4px;\n    }\n\n    .tech-card .tc-name {\n        font-size: 14px;\n        font-weight: 600;\n        color: #111;\n        margin-bottom: 4px;\n    }\n\n    .tech-card .tc-note {\n        font-size: 12px;\n        color: #555;\n        line-height: 1.4;\n    }\n\n    .tech-card .tc-dot {\n        position: absolute;\n        top: 12px;\n        right: 12px;\n        width: 7px;\n        height: 7px;\n        border-radius: 50%;\n        background: var(--accent);\n    }\n\n    .section-header {\n        display: flex;\n        align-items: center;\n        gap: 10px;\n        margin: 2.25rem 0 1rem;\n    }\n\n    .section-header h2 {\n        font-family: var(--sans);\n        font-size: 1.15rem;\n        font-weight: 600;\n        color: #111;\n    }\n\n    .sh-line {\n        flex: 1;\n        height: .5px;\n        background: #ddd;\n    }\n\n    .sh-badge {\n        font-family: var(--mono);\n        font-size: 10px;\n        background: var(--accent-bg);\n        color: var(--accent-dim);\n        border-radius: 4px;\n        padding: 2px 8px;\n        white-space: nowrap;\n        border: .5px solid #99F6E4;\n    }\n\n    p.body {\n        font-size: 15px;\n        color: #111;\n        margin-bottom: 1rem;\n    }\n\n    .pipeline-visual {\n        background: #f7f7f5;\n        border: .5px solid #ddd;\n        border-radius: 12px;\n        padding: 1.25rem 1.5rem;\n        margin: 1.5rem 0;\n        overflow-x: auto;\n        -webkit-overflow-scrolling: touch;\n        touch-action: pan-x pan-y;\n    }\n\n    .pipeline-row {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        flex-wrap: nowrap;\n    }\n\n    .pipeline-col {\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n        align-items: center;\n    }\n\n    .pipe-step {\n        background: #fff;\n        border: .5px solid #ddd;\n        border-radius: 6px;\n        padding: 6px 12px;\n        font-family: var(--mono);\n        font-size: 11px;\n        color: #111;\n        white-space: nowrap;\n        font-weight: 500;\n    }\n\n    .pipe-step.hl {\n        background: var(--accent-bg);\n        border-color: #99F6E4;\n        color: var(--accent-dim);\n    }\n\n    .pipe-label {\n        font-family: var(--mono);\n        font-size: 9px;\n        color: #aaa;\n        text-transform: uppercase;\n        letter-spacing: .06em;\n    }\n\n    .pipe-arrow {\n        color: #999;\n        font-size: 12px;\n        flex-shrink: 0;\n    }\n\n    .code-block {\n        background: #f7f7f5;\n        border: .5px solid #ddd;\n        border-left: 2.5px solid var(--accent);\n        border-radius: 0 8px 8px 0;\n        padding: 1rem 1.25rem;\n        margin: 1rem 0 1.5rem;\n        font-family: var(--mono);\n        font-size: 12px;\n        color: #555;\n        line-height: 1.65;\n        overflow-x: auto;\n    }\n\n    .code-block .kw {\n        color: #0F766E;\n        font-weight: 500;\n    }\n\n    .code-block .str {\n        color: #BA7517;\n    }\n\n    .code-block .cmt {\n        color: #aaa;\n    }\n\n    .tag-cloud {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 6px;\n        margin: 1rem 0 1.5rem;\n    }\n\n    .tag {\n        font-family: var(--mono);\n        font-size: 11px;\n        padding: 4px 10px;\n        border-radius: 100px;\n        border: .5px solid #ccc;\n        color: #555;\n        background: #fff;\n    }\n\n    .tag.primary {\n        background: var(--accent-bg);\n        border-color: #99F6E4;\n        color: var(--accent-dim);\n        font-weight: 500;\n    }\n\n    .callout {\n        background: #f7f7f5;\n        border-left: 2px solid var(--accent);\n        border-radius: 0 8px 8px 0;\n        padding: 1rem 1.25rem;\n        margin: 1.5rem 0;\n        font-size: 14px;\n        color: #555;\n        line-height: 1.65;\n    }\n\n    .callout strong {\n        color: #111;\n        font-weight: 600;\n    }\n\n    .stat-row {\n        display: grid;\n        grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n        gap: 10px;\n        margin: 1.5rem 0;\n    }\n\n    .stat-card {\n        background: #f7f7f5;\n        border-radius: 8px;\n        padding: 1rem;\n        text-align: center;\n    }\n\n    .stat-card .stat-num {\n        font-size: 2rem;\n        font-weight: 700;\n        color: var(--accent-dim);\n        font-family: var(--mono);\n    }\n\n    .stat-card .stat-label {\n        font-size: 12px;\n        color: #555;\n        margin-top: 4px;\n    }\n\n    .employer-row {\n        display: grid;\n        grid-template-columns: 1fr;\n        gap: 10px;\n        margin: 1rem 0;\n    }\n\n    .employer-card {\n        display: flex;\n        gap: 12px;\n        align-items: flex-start;\n        background: #fff;\n        border: .5px solid #ddd;\n        border-radius: 12px;\n        padding: .875rem 1rem;\n    }\n\n    .emp-logo {\n        width: 36px;\n        height: 36px;\n        border-radius: 8px;\n        background: var(--accent-bg);\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-family: var(--mono);\n        font-size: 10px;\n        font-weight: 700;\n        color: var(--accent-dim);\n        flex-shrink: 0;\n        letter-spacing: -.02em;\n        text-align: center;\n        line-height: 1.3;\n    }\n\n    .emp-body .emp-name {\n        font-size: 13px;\n        font-weight: 600;\n        color: #111;\n    }\n\n    .emp-body .emp-desc {\n        font-size: 12px;\n        color: #555;\n        margin-top: 3px;\n        line-height: 1.5;\n    }\n\n    .principles-list {\n        display: grid;\n        grid-template-columns: 1fr;\n        gap: 8px;\n        margin: 1rem 0 1.5rem;\n    }\n\n    .principle-item {\n        display: flex;\n        gap: 12px;\n        align-items: flex-start;\n        padding: .75rem 1rem;\n        background: #f7f7f5;\n        border-radius: 8px;\n    }\n\n    .principle-num {\n        font-family: var(--mono);\n        font-size: 11px;\n        font-weight: 700;\n        color: var(--accent-dim);\n        min-width: 24px;\n        padding-top: 1px;\n    }\n\n    .principle-body {\n        font-size: 13px;\n        color: #555;\n        line-height: 1.5;\n    }\n\n    .principle-body strong {\n        color: #111;\n    }\n\n    .lifecycle-table {\n        width: 100%;\n        border-collapse: collapse;\n        font-size: 13px;\n        margin: 1.5rem 0;\n    }\n\n    .lifecycle-table th {\n        font-family: var(--mono);\n        font-size: 10px;\n        letter-spacing: .08em;\n        text-transform: uppercase;\n        color: #777;\n        font-weight: 500;\n        padding: 8px 12px;\n        border-bottom: .5px solid #ddd;\n        text-align: left;\n    }\n\n    .lifecycle-table td {\n        padding: 8px 12px;\n        border-bottom: .5px solid #f0f0f0;\n        color: #555;\n        vertical-align: top;\n    }\n\n    .lifecycle-table td:first-child {\n        font-weight: 600;\n        color: #111;\n        white-space: nowrap;\n    }\n\n    .lifecycle-table tr:last-child td {\n        border-bottom: none;\n    }\n\n    .footer-note {\n        font-family: var(--mono);\n        font-size: 11px;\n        color: #777;\n        border-top: .5px solid #ddd;\n        margin-top: 3rem;\n        padding-top: 1rem;\n        display: flex;\n        justify-content: space-between;\n        flex-wrap: wrap;\n        gap: 4px;\n    }\n\n    .footer-note a {\n        color: inherit;\n        text-decoration: none;\n        border-bottom: .5px solid #bbb;\n        transition: color .15s, border-color .15s;\n    }\n\n    .footer-note a:hover {\n        color: var(--accent-dim);\n        border-color: var(--accent-dim);\n    }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"blog-root\">\n\n        <div class=\"eyebrow\">Engineering Blog &middot; Konrad Chmielinski<\/div>\n        <p class=\"subtitle\">Designing, building, and maintaining enterprise-grade automation workflows &mdash; from first process analysis to long-term production stability.<\/p>\n\n        <div class=\"meta-row\">\n            <span class=\"meta-chip teal\">RPA Engineering<\/span>\n            <span class=\"meta-chip\">Python &middot; Jenkins &middot; AA A360<\/span>\n            <span class=\"meta-chip\">End-to-end delivery<\/span>\n            <span class=\"meta-chip\">Katowice, PL &middot; Remote OK<\/span>\n        <\/div>\n        <p class=\"body\">Building an RPA bot is straightforward. Building one that runs reliably in production for months, handles every edge case, recovers from failures without human intervention, and stays maintainable as business rules evolve &mdash; that is the actual job.<\/p>\n        <p class=\"body\">I have designed and delivered end-to-end automation workflows across two large enterprises, three RPA platforms, and a wide range of process types &mdash; from financial data consolidation to HR contract generation to compliance reporting. This post covers my full workflow methodology: how I scope, design, build, test, deploy, and maintain production RPA solutions.<\/p>\n\n        <div class=\"stat-row\">\n            <div class=\"stat-card\">\n                <div class=\"stat-num\">30+<\/div>\n                <div class=\"stat-label\">production bots designed and delivered across both employers<\/div>\n            <\/div>\n            <div class=\"stat-card\">\n                <div class=\"stat-num\">3+<\/div>\n                <div class=\"stat-label\">RPA platforms: Python + Jenkins (AM), AA A360 \/ A11 + SAIO (ING), UiPath (certified)<\/div>\n            <\/div>\n            <div class=\"stat-card\">\n                <div class=\"stat-num\">5yr<\/div>\n                <div class=\"stat-label\">end-to-end RPA delivery experience<\/div>\n            <\/div>\n            <div class=\"stat-card\">\n                <div class=\"stat-num\">Global<\/div>\n                <div class=\"stat-label\">bots serving teams in PL, LU, IN, FR, NL, BE, CA, US, BR, AR, SK\n across worldwide<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"section-header\">\n            <h2>The full bot lifecycle<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">how I work<\/div>\n        <\/div>\n        <p class=\"body\">Every bot I deliver goes through the same lifecycle &mdash; whether it is a two-day Python script or a multi-week AA A360 workflow spanning multiple systems.<\/p>\n\n        <div class=\"pipeline-visual\">\n            <div class=\"pipeline-row\">\n                <div class=\"pipeline-col\">\n                    <div class=\"pipe-step hl\">Discover<\/div>\n                    <div class=\"pipe-label\">process analysis<\/div>\n                <\/div>\n                <div class=\"pipe-arrow\">&rarr;<\/div>\n                <div class=\"pipeline-col\">\n                    <div class=\"pipe-step\">Design<\/div>\n                    <div class=\"pipe-label\">flow + exceptions<\/div>\n                <\/div>\n                <div class=\"pipe-arrow\">&rarr;<\/div>\n                <div class=\"pipeline-col\">\n                    <div class=\"pipe-step hl\">Build<\/div>\n                    <div class=\"pipe-label\">develop + unit test<\/div>\n                <\/div>\n                <div class=\"pipe-arrow\">&rarr;<\/div>\n                <div class=\"pipeline-col\">\n                    <div class=\"pipe-step\">UAT<\/div>\n                    <div class=\"pipe-label\">business sign-off<\/div>\n                <\/div>\n                <div class=\"pipe-arrow\">&rarr;<\/div>\n                <div class=\"pipeline-col\">\n                    <div class=\"pipe-step hl\">Deploy<\/div>\n                    <div class=\"pipe-label\">CI\/CD + schedule<\/div>\n                <\/div>\n                <div class=\"pipe-arrow\">&rarr;<\/div>\n                <div class=\"pipeline-col\">\n                    <div class=\"pipe-step\">Monitor<\/div>\n                    <div class=\"pipe-label\">logs + alerts<\/div>\n                <\/div>\n                <div class=\"pipe-arrow\">&rarr;<\/div>\n                <div class=\"pipeline-col\">\n                    <div class=\"pipe-step hl\">Maintain<\/div>\n                    <div class=\"pipe-label\">adapt + improve<\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Process discovery &amp; scoping<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">before one line of code<\/div>\n        <\/div>\n        <p class=\"body\">The most important work in any RPA project happens before development starts. A poorly scoped process leads to bots that handle 80% of cases and break on the other 20% &mdash; which in production means the business users still do manual work, just with less predictability.<\/p>\n        <p class=\"body\">My scoping approach: walk the process end-to-end with the process owner, document every decision point and exception path, identify all input formats and edge cases, and define the exception handling strategy before writing any code. The output is a Process Definition Document (PDD) that the business signs off on before development begins.<\/p>\n\n        <div class=\"tag-cloud\">\n            <span class=\"tag primary\">Process Definition Document (PDD)<\/span>\n            <span class=\"tag primary\">Exception path mapping<\/span>\n            <span class=\"tag primary\">Input format inventory<\/span>\n            <span class=\"tag\">Business stakeholder interviews<\/span>\n            <span class=\"tag\">Process flow diagramming<\/span>\n            <span class=\"tag\">Edge case documentation<\/span>\n            <span class=\"tag\">Automation feasibility assessment<\/span>\n            <span class=\"tag\">ROI estimation<\/span>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Workflow design patterns<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">architecture decisions<\/div>\n        <\/div>\n        <p class=\"body\">Not every process should be a single linear bot. Complex workflows are modular &mdash; split into reusable components with clean interfaces, so individual modules can be tested, updated, and reused across projects. I apply the following design patterns consistently across all platforms.<\/p>\n\n        <div class=\"tech-grid\">\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Pattern<\/div>\n                <div class=\"tc-name\">Dispatcher &mdash; Performer<\/div>\n                <div class=\"tc-note\">Separate queue-feeding logic from processing logic. Enables parallel execution and clean retry handling.<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Pattern<\/div>\n                <div class=\"tc-name\">Modular components<\/div>\n                <div class=\"tc-note\">Reusable sub-workflows for common operations: login, file download, data validation, report generation.<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Pattern<\/div>\n                <div class=\"tc-name\">Exception lanes<\/div>\n                <div class=\"tc-note\">Every workflow has an explicit exception path &mdash; failed items go to a human review queue, never silently dropped.<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Pattern<\/div>\n                <div class=\"tc-name\">Idempotent design<\/div>\n                <div class=\"tc-note\">Bots can be safely re-run on the same input without duplicating output &mdash; critical for financial and HR processes.<\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Error handling &amp; resilience<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">production reality<\/div>\n        <\/div>\n        <p class=\"body\">Production bots fail. SAP sessions time out. Web portals return unexpected page states. Excel files arrive with missing columns. The difference between a demo bot and a production bot is how gracefully it handles these failures &mdash; and how quickly it recovers without human intervention.<\/p>\n\n        <div class=\"principles-list\">\n            <div class=\"principle-item\">\n                <div class=\"principle-num\">01<\/div>\n                <div class=\"principle-body\">\n                    <strong>Retry with backoff<\/strong>\n                     &mdash; transient failures (network timeouts, locked files) are retried automatically with exponential backoff before escalating to an exception.\n                <\/div>\n            <\/div>\n            <div class=\"principle-item\">\n                <div class=\"principle-num\">02<\/div>\n                <div class=\"principle-body\">\n                    <strong>Session recovery<\/strong>\n                     &mdash; long-running bots detect session expiry (SAP, web portals) and re-authenticate automatically without restarting the full workflow.\n                <\/div>\n            <\/div>\n            <div class=\"principle-item\">\n                <div class=\"principle-num\">03<\/div>\n                <div class=\"principle-body\">\n                    <strong>Partial completion tracking<\/strong>\n                     &mdash; large batch processes track which items completed successfully, so a mid-run failure only retries the remaining items, not the full batch.\n                <\/div>\n            <\/div>\n            <div class=\"principle-item\">\n                <div class=\"principle-num\">04<\/div>\n                <div class=\"principle-body\">\n                    <strong>Structured logging<\/strong>\n                     &mdash; every action, decision, and exception is written to a structured log. Post-run reports are automatically generated and sent to process owners.\n                <\/div>\n            <\/div>\n            <div class=\"principle-item\">\n                <div class=\"principle-num\">05<\/div>\n                <div class=\"principle-body\">\n                    <strong>Human exception queue<\/strong>\n                     &mdash; items the bot cannot process are routed to a human review queue with context, never silently skipped or dropped.\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"code-block\">\n            <span class=\"cmt\"># Retry with backoff pattern used in production bots<\/span>\n            <br>\n            <span class=\"kw\">import<\/span>\n             time, logging\n            <br>\n            <br>\n            <span class=\"kw\">def<\/span>\n             with_retry(fn, retries=3, backoff=2):\n            <br>\n\n                &nbsp;&nbsp;\n            <span class=\"kw\">for<\/span>\n             attempt \n            <span class=\"kw\">in<\/span>\n             range(retries):\n            <br>\n\n                &nbsp;&nbsp;&nbsp;&nbsp;\n            <span class=\"kw\">try<\/span>\n            :\n            <br>\n\n                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n            <span class=\"kw\">return<\/span>\n             fn()\n            <br>\n\n                &nbsp;&nbsp;&nbsp;&nbsp;\n            <span class=\"kw\">except<\/span>\n             Exception \n            <span class=\"kw\">as<\/span>\n             e:\n            <br>\n\n                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logging.warning(\n            <span class=\"str\">f&#8221;Attempt {attempt+1} failed: {e}&#8221;<\/span>\n            )\n            <br>\n\n                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n            <span class=\"kw\">if<\/span>\n             attempt + 1 == retries:\n            <br>\n\n                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n            <span class=\"kw\">raise<\/span>\n            <br>\n\n                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(backoff ** attempt)\n              \n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>CI\/CD &amp; deployment<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">shipping bots safely<\/div>\n        <\/div>\n        <p class=\"body\">Bot deployments at ArcelorMittal run entirely on Python + Jenkins CI\/CD pipelines &mdash; code review, automated testing, and staged rollout before production promotion. Bots are triggered in three ways: on a scheduled basis via Jenkins cron, manually on demand, or automatically via an inbound email containing input data or via Microsoft API (Power BI integration). At ING, Automation Anywhere A360 \/ A11 handled orchestration &mdash; used to trigger and manage both AA bots and Python-based standalone bots running on the SAIO platform.<\/p>\n\n        <div class=\"tag-cloud\">\n            <span class=\"tag primary\">Jenkins CI\/CD<\/span>\n            <span class=\"tag primary\">Python standalone bots<\/span>\n            <span class=\"tag primary\">Git branching strategy<\/span>\n            <span class=\"tag primary\">Staged rollout<\/span>\n            <span class=\"tag primary\">Email trigger (inbound data)<\/span>\n            <span class=\"tag primary\">Microsoft API \/ Power BI trigger<\/span>\n            <span class=\"tag\">Scheduled cron (Jenkins)<\/span>\n            <span class=\"tag\">Manual on-demand trigger<\/span>\n            <span class=\"tag\">Environment config management<\/span>\n            <span class=\"tag\">Rollback procedures<\/span>\n            <span class=\"tag\">Deployment documentation<\/span>\n            <span class=\"tag\">Code review gates<\/span>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Monitoring &amp; maintenance<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">keeping bots alive<\/div>\n        <\/div>\n        <p class=\"body\">A deployed bot without monitoring is a liability. I instrument every production bot with structured logging, run-level reporting, and alerting on failure. Process owners receive automated summary emails after each run &mdash; items processed, exceptions raised, and actions required. This keeps the business informed without requiring them to dig into technical logs.<\/p>\n\n        <table class=\"lifecycle-table\">\n            <thead>\n                <tr>\n                    <th>Layer<\/th>\n                    <th>Tool<\/th>\n                    <th>What it covers<\/th>\n                <\/tr>\n            <\/thead>\n            <tbody>\n                <tr>\n                    <td>Orchestration (AM)<\/td>\n                    <td>Jenkins<\/td>\n                    <td>Scheduling, run history, deployment pipeline, cron &amp; trigger management<\/td>\n                <\/tr>\n                <tr>\n                    <td>Orchestration (ING)<\/td>\n                    <td>AA A360 Control Room<\/td>\n                    <td>Bot health, queue status, credential management for AA &amp; Python bots<\/td>\n                <\/tr>\n                <tr>\n                    <td>Logging<\/td>\n                    <td>Python logging \/ custom<\/td>\n                    <td>Structured per-item logs, exception traces, timing data<\/td>\n                <\/tr>\n                <tr>\n                    <td>Alerting<\/td>\n                    <td>Email via Graph API \/ SMTP<\/td>\n                    <td>Run summary to process owner, failure alerts to dev team<\/td>\n                <\/tr>\n                <tr>\n                    <td>Trigger &mdash; email<\/td>\n                    <td>Inbound email parser<\/td>\n                    <td>Bot triggered automatically when email with input data arrives<\/td>\n                <\/tr>\n                <tr>\n                    <td>Trigger &mdash; API<\/td>\n                    <td>Microsoft API \/ Power BI<\/td>\n                    <td>Bot triggered via MS API integration from Power BI reports<\/td>\n                <\/tr>\n                <tr>\n                    <td>Version control<\/td>\n                    <td>Git<\/td>\n                    <td>Full history of all bot code, rollback capability<\/td>\n                <\/tr>\n            <\/tbody>\n        <\/table>\n\n        <div class=\"section-header\">\n            <h2>Technical documentation<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">the part most skip<\/div>\n        <\/div>\n        <p class=\"body\">Every bot I deliver includes a full technical documentation package: Process Definition Document, Solution Design Document, operational runbook, and handover notes. This is not optional &mdash; undocumented bots become unmaintainable the moment the original developer leaves the team. At ArcelorMittal, documentation is a delivery requirement, not an afterthought.<\/p>\n\n        <div class=\"tag-cloud\">\n            <span class=\"tag primary\">Process Definition Document (PDD)<\/span>\n            <span class=\"tag primary\">Solution Design Document (SDD)<\/span>\n            <span class=\"tag primary\">Operational runbook<\/span>\n            <span class=\"tag\">Exception handling guide<\/span>\n            <span class=\"tag\">Deployment checklist<\/span>\n            <span class=\"tag\">Handover documentation<\/span>\n            <span class=\"tag\">Change log<\/span>\n            <span class=\"tag\">Confluence \/ SharePoint<\/span>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Key production deployments<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">largest &amp; most impactful<\/div>\n        <\/div>\n\n        <div class=\"employer-row\">\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">ING<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ING Hubs Poland (GKYC) &mdash; CDD Financial Risk Analysis Report Automation<\/div>\n                    <div class=\"emp-desc\">Production bot generating financial risk analysis reports on entities as part of Customer Due Diligence (CDD) processes. Data sourced from a dedicated CDD database compiled from banking intelligence and government sources. Bot queries, aggregates, and processes the available data to produce structured risk reports supporting compliance analysts in assessing the financial risk profile of investigated entities.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">ING<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ING Hubs Poland (GKYC) &mdash; Account &amp; Entity Holder Intelligence Report Automation<\/div>\n                    <div class=\"emp-desc\">Production bot aggregating data from multiple heterogeneous sources &mdash; internal databases, banking systems, and restricted bank-grade resources &mdash; to generate comprehensive KYC intelligence reports on account holders and proxy holders of accounts and legal entities. Reports cover estimated asset holdings and financial capacity, as well as a structured assessment of the relationship type between the holder and the entity. Designed to handle data inconsistencies across sources and produce audit-ready output for compliance and due diligence workflows.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal BCoE Poland &mdash; Global Invoice Duplicate Detection<\/div>\n                    <div class=\"emp-desc\">Designed and built an automated workflow analysing over five years of historical invoice data from ArcelorMittal entities worldwide to identify potential duplicates and prevent approval of future duplicate payments. The dataset spans global operations across all business units and regions. Idempotent design critical &mdash; re-runs must never create false duplicate flags on already-processed transactions.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal BCoE Poland &mdash; Global Market Forecasting<\/div>\n                    <div class=\"emp-desc\">Bot consolidating Excel data from all global business units into a centralised database for multi-year market trend prediction and investment profitability analysis. Dispatcher&mdash;Performer pattern with per-unit exception handling, automated reporting, and web application write-back.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal BCoE Poland &mdash; SAP Invoice Processing Automation<\/div>\n                    <div class=\"emp-desc\">Production bot automating the processing and entry of invoice data into SAP. Reads structured invoice data from Excel source files, validates records, and performs the corresponding SAP data entry operations. Designed with robust error handling to manage inconsistent input data and ensure reliable, auditable processing across high invoice volumes.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal BCoE Poland &mdash; VBA to Python Migration: Cylindrical Products Order &amp; Invoice Processing<\/div>\n                    <div class=\"emp-desc\">Migration of a legacy VBA script to a production-grade standalone Python solution handling order entry and invoice data processing for cylindrical steel products. Rewrote business logic in Python with proper error handling, structured logging, and maintainable architecture &mdash; eliminating the fragility and maintenance overhead of the original macro-based approach.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<br><span style=\"font-size:8px\">LUX<\/span><\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal Luxembourg &mdash; REX Portal: Statistical Damage Assessment Automation<\/div>\n                    <div class=\"emp-desc\">Production bot automating data entry and operations in the REX compliance portal, focused on purely statistical incident data. Handles input, validation, and manipulation of quantitative records including damage assessment scores and financial loss estimations. High data accuracy critical &mdash; statistical outputs feed into group-level safety analysis and investment decisions.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<br><span style=\"font-size:8px\">LUX<\/span><\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal Luxembourg &mdash; SARA Portal: Incident Report Automation<\/div>\n                    <div class=\"emp-desc\">Production bot automating data entry into the SARA compliance portal for workplace incident and accident reporting. Processes descriptive incident data alongside photographic evidence and supporting attachments documenting each event. Bot handles structured form population, photo upload, and document attachment &mdash; ensuring complete and consistent incident records across all reporting entities.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal BCoE Poland &mdash; HRS Employee Suspension Automation<\/div>\n                    <div class=\"emp-desc\">Production bot automating the suspension of employee functions within SAP. Processes suspension requests, applies the relevant status changes and access restrictions across HR records, and generates the required documentation. Designed with idempotent logic &mdash; re-runs on the same case cannot produce duplicate or conflicting record states.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal BCoE Poland &mdash; HRS Employee Offboarding Contract Automation<\/div>\n                    <div class=\"emp-desc\">Production bot automating generation of employment termination contracts and related HR documents. Processes entity and financial data, populates SAP records, and generates the full document package required to close an employee&#8217;s contract. End-to-end delivery: process scoping with global HR stakeholders &rarr; PDD &rarr; bot development &rarr; UAT &rarr; Jenkins deployment &rarr; documentation handover.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal BCoE Poland &mdash; HRS Employee Onboarding Contract Automation<\/div>\n                    <div class=\"emp-desc\">Production bot automating generation of employment commencement contracts for new hires. Extracts data from HR and financial source documents, creates SAP entries, and produces the full onboarding contract package. Designed to handle multiple entity types and country-specific contract variations across global business units.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal BCoE Poland &mdash; HRS Training Agreement Automation<\/div>\n                    <div class=\"emp-desc\">Production bot automating generation of employee training agreements. Processes training data inputs, generates the required agreement documents, and updates SAP accordingly. Modular design allows independent handling of different training types and contract templates across regions.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">ING<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ING Hubs Poland (GKYC) &mdash; SAIO GUI Bot &amp; Platform Promotion<\/div>\n                    <div class=\"emp-desc\">Designed and implemented a desktop automation bot distributed directly to end-user physical machines via ING&#8217;s proprietary SAIO platform \u2014 running on analysts&#8217; own computers rather than virtual machines or dedicated automation servers. With a single click, the bot prepared the user&#8217;s desktop environment for a specific task \u2014 launching and arranging the required applications, navigating to the correct screens, and partially pre-filling data to reduce manual input. Eliminated repetitive setup steps at the start of each work item, allowing analysts to focus immediately on the task itself. Also actively promoted SAIO adoption within the team &mdash; prepared and delivered training sessions and best-practice documentation to upskill colleagues in RPA workflow design.<\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Full stack<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">everything I use<\/div>\n        <\/div>\n        <div class=\"tag-cloud\">\n            <span class=\"tag primary\">Python (standalone bots)<\/span>\n            <span class=\"tag primary\">Jenkins CI\/CD<\/span>\n            <span class=\"tag primary\">Git<\/span>\n            <span class=\"tag primary\">Automation Anywhere A360<\/span>\n            <span class=\"tag primary\">Automation Anywhere A11<\/span>\n            <span class=\"tag primary\">SAIO (ING proprietary)<\/span>\n            <span class=\"tag\">UiPath (certified, no production)<\/span>\n            <span class=\"tag\">AA Control Room<\/span>\n            <span class=\"tag\">AA Credential Vault<\/span>\n            <span class=\"tag\">Pydantic (data contracts)<\/span>\n            <span class=\"tag\">Pandas (data processing)<\/span>\n            <span class=\"tag\">Microsoft Graph API (alerting &amp; triggers)<\/span>\n            <span class=\"tag\">Power BI API integration<\/span>\n            <span class=\"tag\">Inbound email trigger<\/span>\n            <span class=\"tag\">SAP GUI Scripting<\/span>\n            <span class=\"tag\">Selenium<\/span>\n            <span class=\"tag\">Process Definition Document<\/span>\n            <span class=\"tag\">Solution Design Document<\/span>\n            <span class=\"tag\">Dispatcher&mdash;Performer pattern<\/span>\n            <span class=\"tag\">Exception lane design<\/span>\n            <span class=\"tag\">Structured logging<\/span>\n            <span class=\"tag\">Retry with backoff<\/span>\n        <\/div>\n\n        <div class=\"footer-note\">\n            <span><a href=\"mailto:konrad.chmielinski@outlook.com\">konrad.chmielinski@outlook.com<\/a><\/span>\n            <span><a href=\"https:\/\/www.linkedin.com\/in\/konrad-chmieli%C5%84ski-ba568320a\/\" target=\"_blank\" rel=\"noopener noreferrer\">linkedin.com\/in\/konrad-chmielinski<\/a><\/span>\n            <span>Open to remote &middot; Full-time \/ B2B<\/span>\n        <\/div>\n\n    <\/div>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>RPA Workflows &mdash; Konrad Chmielinski Engineering Blog &middot; Konrad Chmielinski Designing, building, and maintaining enterprise-grade automation workflows &mdash; from first process analysis to long-term production stability. RPA Engineering Python &middot; Jenkins &middot; AA A360 End-to-end delivery Katowice, PL &middot; Remote OK Building an RPA bot is straightforward. Building one that runs reliably in production for months, handles every edge case, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":134,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-32","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-skills"],"views":30,"_links":{"self":[{"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/posts\/32","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/comments?post=32"}],"version-history":[{"count":22,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/posts\/32\/revisions"}],"predecessor-version":[{"id":522,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/posts\/32\/revisions\/522"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/media\/134"}],"wp:attachment":[{"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/media?parent=32"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/categories?post=32"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/tags?post=32"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}