--- id: "a55a2931-cf9d-408e-80ff-273cecd753b4" name: "Jira assignment-date + due-date helper" micro_summary: "Browser-harness helper `bto_jira_get_assignment_dates()` using changelog API to get per-ticket assignedDate, assignedBy, and dueDate; 2026-06-19 run captured all 22 active Jira tickets with results saved to disk." status: "in_progress" see_also: [] scope: "Browser-harness helper `bto_jira_get_assignment_dates()`: uses Jira changelog API to find when each issue was assigned to the current user, and returns due date from issue fields." --- ## Purpose Small durable helper that fetches **assignment dates** (when an issue was assigned to the current user) and **due dates** for Jira Cloud tickets. Uses the Jira changelog API to find the timestamp when `assignee` was last changed to the target user. Unlike `bto_jira_audit()` which only captures the current `updated` timestamp, this helper walks the issue changelog to find the exact moment of assignment. ## Preconditions - An authenticated Chrome tab with `billiontoone.atlassian.net` open in the current user profile. The helper will auto-find and switch to it. - READ-ONLY: fetches issue fields + changelog. Does not mutate anything. ## Helper definition Function: `bto_jira_get_assignment_dates(issue_keys, expected_assignee="Jack ten Bosch")` Args: - `issue_keys`: list of Jira issue key strings (e.g. `["SFAI-12", "SO-1002"]`) - `expected_assignee`: display name to match in changelog (default "Jack ten Bosch") Returns dict: ```python { "issues": { "SFAI-12": { "key": "SFAI-12", "title": "Design CS agent memory guardrails", "assignedDate": "2026-06-11T20:51:20.394-0700" or None, "assignedBy": "Jack ten Bosch" or None, "dueDate": "2026-06-18" or "", "currentAssignee": "Jack ten Bosch", "assigneeChanges": [{"from": "", "to": "Jack ten Bosch", "changedAt": "...", "changedBy": "..."}] }, ... }, "errors": [], "fetchedAt": "2026-06-19T15:57:41-07:00" } ``` ## How to run ```bash browser-harness <<'PY' import json issue_keys = ["SFAI-12", "SO-1002", ...] # list all keys needed result = bto_jira_get_assignment_dates(issue_keys) print(json.dumps(result, indent=2, ensure_ascii=False)) PY ``` ## Output / artifacts - Clean JSON saved to: `/Users/jack/.cache/pi-jira-audit/jira_assignment_dates_.json` ## Notes - **No changelog = created with assignee already set.** Some tickets (SFAI-1, SO-960, SO-985, SO-986, SO-987) have no `assignee` changelog entry because they were created with the assignee already populated. For those, the `assignedDate` is effectively the ticket `created` date, which this helper does NOT capture — only changelog timestamps. Enhancement: fetch `created` field as fallback. - Rate-limited: adds 0.3s sleep between ticket fetches. For 22 tickets, runtime is ~15-20 seconds. - The helper is already committed to `agent_helpers.py` in the browser-harness repo. ## 2026-06-19 run — results for 22 active Jira tickets All 22 active assigned tickets were queried. Full results saved to disk. ### Tickets WITH assignment dates (17 of 22) | Key | Assigned Date | Assigned By | Due Date | |-----|--------------|-------------|----------| | SFAI-6 | 2026-06-11 20:51:17 -0700 | Jack ten Bosch | 2026-08-17 | | SFAI-7 | 2026-06-11 20:51:17 -0700 | Jack ten Bosch | — | | SFAI-10 | 2026-06-11 20:51:19 -0700 | Jack ten Bosch | 2026-06-18 | | SFAI-12 | 2026-06-11 20:51:20 -0700 | Jack ten Bosch | — | | SFAI-13 | 2026-06-11 20:51:20 -0700 | Jack ten Bosch | — | | SFAI-14 | 2026-06-11 20:51:21 -0700 | Jack ten Bosch | — | | SFAI-2 | 2026-06-11 15:34:48 -0700 | Jack ten Bosch | 2026-06-19 | | SFAI-3 | 2026-06-11 15:35:32 -0700 | Jack ten Bosch | 2026-06-19 | | SFAI-5 | 2026-06-11 15:51:40 -0700 | Jack ten Bosch | 2026-06-19 | | SFAI-15 | 2026-06-12 10:08:45 -0700 | Jack ten Bosch | 2026-06-19 | | SFAI-16 | 2026-06-15 08:55:44 -0700 | Jack ten Bosch | — | | SFAI-17 | 2026-06-18 01:31:12 -0700 | Jack ten Bosch | — | | SFAI-18 | 2026-06-18 01:31:06 -0700 | Jack ten Bosch | — | | SFAI-19 | 2026-06-18 01:30:15 -0700 | Jack ten Bosch | — | | SO-1002 | 2026-06-16 12:07:19 -0700 | Tyler Masar | — | | SO-932 | 2026-06-01 09:51:27 -0700 | Henry Sakhel | — | | SO-933 | 2026-05-27 13:01:21 -0700 | Henry Sakhel | — | ### Tickets WITHOUT changelog assignee entry (5 of 22) These were likely created with the assignee already set — `assignedDate` is effectively the ticket `created` date, not captured here: - SFAI-1 (ONEplace - Salesforce Agent Web UI) — due 2026-08-17 - SO-960 (Auto-Create CLA Case) — due 2026-06-08 - SO-985 (Build ONEPlace App) - SO-986 (Write ONEPlace Documentation) - SO-987 (Install for SFDC Team)