Generate a weekly OKR status update for a given Objective or Key Result ticket and post it as a comment.
Usage: /okr-update <TICKET-KEY> (e.g., /okr-update INFOKR-7)
-
Resolve the target ticket: Fetch the provided ticket using the Atlassian MCP
getJiraIssuetool. Include theissuelinksfield.- Atlassian cloud ID:
d8febd08-c6e9-4c03-9c13-db37c2369ce5
- Atlassian cloud ID:
-
Find fulfilling epics: From the ticket's issue links, find all issues linked via the "Fulfills" relationship (inward: "is fulfilled by"). These are the epics that deliver on this OKR.
-
Gather ticket data: For each fulfilling epic, query Jira for child issues that have been updated or created in the last 7 days:
- Use JQL:
parent = <EPIC-KEY> AND (status changed AFTER -7d OR created >= -7d) ORDER BY status ASC, updated DESC - Fetch summary, status, and updated fields
- If there are multiple fulfilling epics, aggregate results across all of them
- Use JQL:
-
Read the previous update: Fetch the latest comment on the target ticket to understand what was previously reported and maintain continuity.
-
Synthesize tickets into themes: Group the raw ticket data into 2–4 meaningful themes or capability areas (e.g. "Helm chart standardization", "Observability", "On-prem readiness"). Do not list tickets one-by-one — synthesize them into outcomes.
-
Determine status: Ask the user whether the OKR is:
- ON TRACK (green)
- AT RISK (yellow)
- OFF TRACK (red)
-
Draft the update for a VP or executive audience. Write at a strategic altitude — focus on outcomes, milestone progress, and risk, not individual task completion. Each theme bullet has a narrative summary followed by a sub-bullet list of the supporting ticket links. Each section should have 2–4 theme bullets max.
**Status**: <STATUS TEXT>
**Accomplished:**
- **<Theme or outcome>** — <1-2 sentence description of what was achieved and why it matters>
- Ticket summary - [TICKET-KEY](link)
- Ticket summary - [TICKET-KEY](link)
**In Flight:**
- **<Theme or capability area>** — <what is being worked on and what it unblocks>
- Ticket summary - [TICKET-KEY](link)
- Ticket summary - [TICKET-KEY](link)
**Upcoming / At Risk:**
- **<Theme or risk>** — <what's next or what's blocking progress, and the impact if delayed>
- Ticket summary - [TICKET-KEY](link)
-
Iterate with the user until they approve the content.
-
Post the comment to the target ticket using the Atlassian MCP
addCommentToJiraIssuetool withcontentFormat: adf. ThecommentBodymust be a JSON string containing the ADF document.
The comment must be posted as ADF (Atlassian Document Format) JSON to support native Jira status lozenges. Use this structure:
- ON TRACK:
"color": "green" - AT RISK:
"color": "yellow" - OFF TRACK:
"color": "red"
{
"type": "doc",
"version": 1,
"content": [
{
"type": "paragraph",
"content": [
{"type": "text", "text": "Status", "marks": [{"type": "strong"}]},
{"type": "text", "text": ": "},
{"type": "status", "attrs": {"text": "AT RISK", "color": "yellow", "localId": "", "style": ""}},
{"type": "text", "text": " "}
]
},
{
"type": "paragraph",
"content": [
{"type": "text", "text": "Accomplished:", "marks": [{"type": "strong"}]}
]
},
{
"type": "bulletList",
"content": [
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [
{"type": "text", "text": "Theme title", "marks": [{"type": "strong"}]},
{"type": "text", "text": " — narrative summary sentence describing outcome and why it matters."}
]
},
{
"type": "bulletList",
"content": [
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [
{"type": "text", "text": "Ticket summary - "},
{"type": "text", "text": "MZCLD-1234", "marks": [{"type": "link", "attrs": {"href": "https://mozilla-hub.atlassian.net/browse/MZCLD-1234"}}]}
]
}
]
}
]
}
]
}
]
},
{
"type": "paragraph",
"content": [
{"type": "text", "text": "In Flight:", "marks": [{"type": "strong"}]}
]
},
{
"type": "bulletList",
"content": []
},
{
"type": "paragraph",
"content": [
{"type": "text", "text": "Upcoming:", "marks": [{"type": "strong"}]}
]
},
{
"type": "bulletList",
"content": []
}
]
}- Bold text:
{"type": "text", "text": "...", "marks": [{"type": "strong"}]} - Link:
{"type": "text", "text": "TICKET-KEY", "marks": [{"type": "link", "attrs": {"href": "https://mozilla-hub.atlassian.net/browse/TICKET-KEY"}}]} - Status lozenge:
{"type": "status", "attrs": {"text": "STATUS", "color": "green|yellow|red", "localId": "", "style": ""}} - Section header: paragraph node with bold text
- Theme bullet with sub-bullets:
bulletList>listItem> [paragraph(theme narrative),bulletList(ticket links)] nodes - Ticket sub-bullet: summary text followed by
-and the ticket link (no checkmarks)
- Atlassian cloud ID:
d8febd08-c6e9-4c03-9c13-db37c2369ce5 - Comment field name:
commentBody(notbody) - Content format:
adf(notmarkdown) - Link type to follow: "Fulfills" (outward) / "is fulfilled by" (inward)
- The
commentBodyvalue must be a JSON string of the ADF document