Runtime Overview
This page summarizes current behavior. Canonical ownership of module layout and runtime contracts is in Project Layout and Container Runtime Contract.
Co je implementovano
- Python worker bezici v Docker kontejneru modulu
ab-ticket-bot-jobs. - Samostatny docs packaging modul
ab-ticket-bot-docs, ktery servuje root MkDocs dokumentaci. - Scheduler spousteny podle
AUTO_SHIFT_LOCK_CRON(5-field cron). - Polling WhatsApp Adapter z konkretni WhatsApp skupiny.
- Parsovani prefixu:
ab<cislo>na zacatku zpravy = zalozeni/aktualizace Jira ticketux<cislo>na zacatku zpravy = uzavre navazovani jen pro autora teto zpravy a daneab<cislo>x(bez cisla) na zacatku zpravy = uzavre aktualne aktivniab<cislo>kontext autora?na zacatku zpravy = bot posle do skupiny kratkou napovedu k pouziti- nova explicitni zprava
ab<cislo>od stejneho autora navazovani znovu otevre - Pokud od stejneho autora po
ab<cislo>prijde zprava bez prefixu, bot ji bere jako pokracovani posledniho aktivnihoab<cislo>a ulozi do stejneho ticketu. - Zpravy se zpracovavaji od vsech clenu sledovane skupiny (krome
fromMeodeslani bota). - Pokud je zprava uspesne zpracovana (
abcreate/update,xclose nebo?help), bot prida reakci🤖na puvodni zpravu ve WhatsApp. - Zakladani ticketu do Jira projektu (
JIRA_PROJECT_KEY) + doplnovanidescription. Zapis dodescriptionma format[YYYY-MM-DD HH:mm] <text-zpravy>. - Pri chybejicim lokalnim mapovani bot nejdriv vyhleda existujici Jira issue
(
project + issue type AB Test + exact summary) a napoji mapovani na nalezeny issue key. - Deduplikace je 2-vrstvova:
- podle
message_id - podle fingerprintu zpravy (
author + text + casovy bucket) - Stav deduplikace se uklada prubezne po kazde zpracovane zprave, aby restart nezpusobil opakovane zpracovani.
- Zpetna kontrola historie za poslednich
AUTO_SHIFT_LOCK_HISTORY_DAYSpri startu. - Ukladani mapovani
ab<cislo> -> Jira issue keydo CSV. - Ukladani runtime stavu (zpracovane message ID + posledni poll timestamp) do CSV souboru.
- Rotace logu po 100 MB.
Konfigurace Jobs Modulu
Standard je:
ab-ticket-bot-jobs/.env.exampleje commitovany priklad konfiguracesecrets/local/ab-ticket-bot-jobs.envasecrets/prod/ab-ticket-bot-jobs.envjsou zdroj pravdyab-ticket-bot-jobs/.env.localaab-ticket-bot-jobs/.env.serverjsou materializovane runtime artefakty
Povinne promenne:
AUTO_SHIFT_LOCK_WHATSAPP_ADAPTER_BASE_URLAUTO_SHIFT_LOCK_WHATSAPP_ADAPTER_API_TOKENAUTO_SHIFT_LOCK_WHATSAPP_ADAPTER_SESSIONAUTO_SHIFT_LOCK_NOTIFY_CONVERSATION_IDJIRA_EMAILJIRA_API_TOKEN
Aktualni cilove conversation ID:
- local secret
secrets/local/ab-ticket-bot-jobs.env:AUTO_SHIFT_LOCK_NOTIFY_CONVERSATION_ID=grp_01ebfab2a215 - prod secret
secrets/prod/ab-ticket-bot-jobs.env:AUTO_SHIFT_LOCK_NOTIFY_CONVERSATION_ID=grp_b6f05648107a
Doporucene (maji default):
JIRA_BASE_URL(defaulthttps://internet-handel.atlassian.net)JIRA_PROJECT_KEY(defaultESH)AUTO_SHIFT_LOCK_DRY_RUN(default1)
Volitelne promenne:
AUTO_SHIFT_LOCK_CRON(default* * * * *)AUTO_SHIFT_LOCK_TIMEZONE(defaultEurope/Prague)AUTO_SHIFT_LOCK_MODULE_NAME(defaultab-ticket-bot-jobs)AUTO_SHIFT_LOCK_HISTORY_DAYS(default10)AUTO_SHIFT_LOCK_FETCH_LIMIT(default200)AUTO_SHIFT_LOCK_JIRA_LABEL(defaultAB_testy)AUTO_SHIFT_LOCK_MAPPING_CSV(default/app/data/ticeket-mapping.csv)AUTO_SHIFT_LOCK_STATE_FILE(default/app/data/ab_ticket_state.csv)AUTO_SHIFT_LOCK_AUTHOR_CONTEXT_CSV(default/app/data/author-conversation.csv)JIRA_CLOUD_ID(pro scoped tokeny)JIRA_ISSUE_TYPE(defaultAB Test)
AUTO_SHIFT_LOCK_STATE_FILE funguje jako prefix; bot z nej odvozi vice CSV souboru
(-meta.csv, -processed-message-ids.csv, -processed-fingerprints.csv, -last-ab-by-author.csv).
Migracni poznamka:
- worker zatim akceptuje i legacy WAHA env nazvy (
AUTO_SHIFT_LOCK_WAHA_*,AUTO_SHIFT_LOCK_NOTIFY_GROUP_CHAT_ID), ale canonical konfigurace je WhatsApp Adapter varianta uvedena vyse
AUTO_SHIFT_LOCK_DRY_RUN:
1= zablokuje pouze zalozeni noveho Jira ticketu (create). Ostatni behavior bezi: update existujicich ticketu, WhatsApp reakce🤖, lokalni persistence.0= create ticketu je povolen.
Skripty
- Root orchestration:
scripts/start.sh,scripts/stop.sh,scripts/deploy.sh - Jobs module:
ab-ticket-bot-jobs/scripts/ab-ticket-bot-jobs-start.sh - Docs module:
ab-ticket-bot-docs/scripts/ab-ticket-bot-docs-start.sh
Primy jobs compose prikaz:
docker compose --env-file ab-ticket-bot-jobs/.env.local \
-f ab-ticket-bot-jobs/docker-compose.yml \
--project-name ab-ticket-bot-jobs \
up -d --build
Docs Modul
Docs modul servuje root docs/ a root mkdocs.yml pres zabaleny staticky site image.
- lokalni bind default:
127.0.0.1:18081 - produkcni URL:
https://ab-ticket-bot-docs.mathbox.90.cz/ - health endpoint:
GET /healthz - produkcni TLS a public routing zajistuje HAProxy na serveru
mathbox.90.cz - canonical docs source zustava v repo rootu; modul si pred buildem synchronizuje
build-context/
Remote Deploy
Remote deploy pouziva modulove adresare pod:
/home/agent/docker_deployments/ab-ticket-bot/ab-ticket-bot-jobs/home/agent/docker_deployments/ab-ticket-bot/ab-ticket-bot-docs
Na server se neprenasi root repository; kazdy modul se deployuje samostatne.
Perzistence
- Jobs logy (host):
ab-ticket-bot-jobs/logs - Jobs data (host):
ab-ticket-bot-jobs/data
Soubory:
ab-ticket-bot-jobs/data/ticeket-mapping.csvab-ticket-bot-jobs/data/ab_ticket_state-meta.csvab-ticket-bot-jobs/data/ab_ticket_state-processed-message-ids.csvab-ticket-bot-jobs/data/ab_ticket_state-processed-fingerprints.csvab-ticket-bot-jobs/data/ab_ticket_state-last-ab-by-author.csvab-ticket-bot-jobs/data/author-conversation.csv
CSV schema:
ticeket-mapping.csv:ab_id,issue_key,closedauthor-conversation.csv:author,active_ab_id,closedactive_ab_id= posledni explicitne aktivovaneab<cislo>pro autoraclosed=1= autor ma navazovani uzavrene a zpravy bez prefixu se ignorujiab_ticket_state-meta.csv:key,value(aktualne hlavnelast_poll_timestamp)ab_ticket_state-processed-message-ids.csv:message_id,timestampab_ticket_state-processed-fingerprints.csv:fingerprint,timestampab_ticket_state-last-ab-by-author.csv:author,ab_id
Datovy model (tabulka)
| Soubor | Sloupce | Ucel |
|---|---|---|
ticeket-mapping.csv |
ab_id,issue_key,closed |
Persistuje vazbu lokalniho ab<cislo> na Jira issue key. |
author-conversation.csv |
author,active_ab_id,closed |
Udrzuje aktivni AB kontext na autora a stav navazovani po x. |
ab_ticket_state-meta.csv |
key,value |
Systemovy checkpoint (last_poll_timestamp) pro dalsi polling. |
ab_ticket_state-processed-message-ids.csv |
message_id,timestamp |
Deduplikace podle message_id napric restarty. |
ab_ticket_state-processed-fingerprints.csv |
fingerprint,timestamp |
Deduplikace stejnych textu v kratkem casovem bucketu. |
ab_ticket_state-last-ab-by-author.csv |
author,ab_id |
Interni fallback kontext autora. |
Datovy model 1: Mapping + autor kontext

Datovy model 2: Runtime checkpoint + deduplikace

Tok a vztahy dat:
- Na startu runu bot nacte
last_poll_timestampzab_ticket_state-meta.csva z toho urci casove okno, odkud ma cist zpravy. - Pro kazdou zpravu nejdriv kontroluje
ab_ticket_state-processed-message-ids.csv(presna deduplikace podlemessage_id). - Pokud
message_idjeste neexistuje, kontrolujeab_ticket_state-processed-fingerprints.csv(deduplikace stejnych textu od stejneho autora v kratkem casovem bucketu). - Po uspesnem zpracovani zpravy zapise oba zaznamy (
message_idifingerprint) a stav ulozi hned na disk, aby restart neopakoval zpracovani. - Na konci runu aktualizuje
last_poll_timestampvab_ticket_state-meta.csva zaroven proreze stare deduplikacni zaznamy podleAUTO_SHIFT_LOCK_HISTORY_DAYS. ab_ticket_state-last-ab-by-author.csvje interni pomocny stav; hlavni navazovani konverzace autoru je vedeno vauthor-conversation.csv.
Prakticky efekt:
metaurcuje od kdy cist.processed-message-idsbrani presnym duplicitam.processed-fingerprintsbrani duplicitam se zmenenymmessage_id.
Mapovani host/container:
- host
ab-ticket-bot-jobs/dataje namountovano do containeru jako/app/data - bot uvnitr zapisuje do:
/app/data/ticeket-mapping.csv/app/data/ab_ticket_state-meta.csv/app/data/ab_ticket_state-processed-message-ids.csv/app/data/ab_ticket_state-processed-fingerprints.csv/app/data/ab_ticket_state-last-ab-by-author.csv/app/data/author-conversation.csv
Logy
- V kontejneru:
/app/logs - Lokalni jobs mount:
ab-ticket-bot-jobs/logs - Aktivni jobs log:
ab-ticket-bot-jobs/logs/ab-ticket-bot-jobs.log - Rotace:
ab-ticket-bot-jobs.0001.log,ab-ticket-bot-jobs.0002.log, ...