# Jira poller enrichment Hourly automation that enriches unassigned Jira tickets with CollabFinder command output posted as ADF comments. Orchestrated by [`services/jiraPollerService.js`](../jiraPollerService.js); scheduled in `index.js` when `JIRA_POLLER_ROOM_ID` is set. ## Flow ``` JQL search → classifyTicket (AI) → resolveEnrichmentPlan (rules) → runEnrichmentChecks (collectors + renderers) → Jira ADF comment → label bot-enriched → Webex summary ``` Idempotency uses Jira labels (`bot-enriched`, `bot-skipped`), not local state. Transient failures leave the ticket unlabeled for retry next hour. The Webex summary posts each enriched ticket key as a markdown link to `JIRA_BASE_URL/browse/{key}` so keys are clickable in the space. ## Communication Services symptom rules For tickets with component **Communication Services** and a resolvable store: | Symptom keywords | Checks run | |------------------|------------| | Call quality / connectivity (garbled, static, can't connect, …) | `voicestatus` + `callreport` | | Spam / robocall / nuisance | `callreport` only | | Neither | Default: `phone` → voicestatus, `av` → avstatus | `callreport` uses the **today** business window (9am local → now minus 5 min). Store number comes from the AI classifier; if missing but a symptom rule matched, the planner falls back to `Store NNNN` in the summary. ## Adding a new symptom rule 1. Open [`enrichmentRules.js`](enrichmentRules.js). 2. Add regex patterns to `CALL_QUALITY_PATTERNS`, `SPAM_PATTERNS`, or a new pattern list. 3. Extend `resolveEnrichmentPlan()` to push a rule id into `matchedRules` and append check ids to `checks`. 4. Add tests in `tests/jiraPoller.enrichmentRules.test.js`. ## Adding a new enrichment check 1. Register the check in `CHECK_IDS` and `CHECK_RUNNERS` in [`runEnrichment.js`](runEnrichment.js) (collector + renderer, same as the chat command). 2. Reference the new check id from a rule in `enrichmentRules.js`. 3. Add tests in `tests/jiraPoller.runEnrichment.test.js`. ## Manual trigger ``` /jirapoll run poller now /jirapoll prime label backlog without enriching (one-time adoption) ``` ## Environment | Variable | Purpose | |----------|---------| | `JIRA_POLLER_ROOM_ID` | Webex room for hourly summary + enables cron | | `JIRA_STORE_FIELD_ID` | Pin Store Number custom field id | | `JIRA_POLLER_MODEL` | Override X.AI model for classification | | `CDR_FEED_COOLDOWN_MS` | cdr_feed rate limit (default 65000) for callreport | See `.env.example` for full Jira poller section.