Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions jira/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# Jira Team Context

## User

Load your persona from `personas/` to tailor agent behaviour to your role:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be great to load the persona automatically, as you already listed the squad lead, and we know who is the director :p


- **Director / Product Owner** → `personas/director.md`
- **Squad Lead** → `personas/squad-lead.md`
- **Developer / Individual Contributor** → `personas/developer.md`

## Atlassian

- **Site:** [warthogs](https://warthogs.atlassian.net)
- **Cloud ID:** `220bceb6-6b32-4813-90eb-68d67c9445db`

## Projects

| Project Key | Project Name |
|-------------|---------------------|

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|-------------|---------------------|
|---|---|

| UDENG | Desktop Roadmap |

## Team

The authoritative roster of all Desktop team members is maintained in
the GitHub team:
[IS Platform Services: Desktop](https://github.com/orgs/canonical/teams/is-platform-services-desktop)

## Squads

| Squad | Project | Jira Team Name (`customfield_10001`) |
|--------------------------|---------|---------------------------------------|

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|--------------------------|---------|---------------------------------------|
|---|---|---|

| GNOME Team | UDENG | Desktop \| GNOME |
| Integration Team | UDENG | Desktop \| Integration |
| Apps Team | UDENG | Desktop \| Apps |
| Enterprise Team | UDENG | Desktop \| Enterprise |
| Core Desktop Team | UDENG | Desktop \| Core |
| WSL Team | UDENG | Desktop \| WSL |
| Design Team | UDENG | Desktop \| Design |

## Issue Hierarchy

`Objectives > Epics > Stories / Tasks / Spikes`

| Issue Type | Timebox | Sized by | Notes |
|------------|---------------|--------------|----------------------------------------------------|

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|------------|---------------|--------------|----------------------------------------------------|
|---|---|---|---|

| Objective | LTS Cycle | - | Owned/triaged by director or senior leads |
| Epic | Release Cycle | T-shirt size | Roadmap commitment; max XL per person per cycle |
| Story | Pulse | Story points | Delivers incremental value; fits in one pulse |
| Task | Pulse | Story points | Background/overhead work; may not have parent Epic |
| Spike | Pulse | Story points | Investigation/ideation to break down parent work |

## Key Custom Fields

| Field | Jira ID | Notes |
|--------------|---------------------|--------------------------------------------------|

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|--------------|---------------------|--------------------------------------------------|
|---|---|---|

| Team | `customfield_10001` | Squad name (see Squads table) |
| T-shirt size | `customfield_10040` | XS, S, M, L, XL — used on Epics |
| Roadmap Item | `customfield_10615` | Value `"Roadmap Item"` — marks Epic as committed |
| Story Points | `customfield_10016` | Used on Stories, Tasks, Spikes — **Note:** the API returns story points in `customfield_10024` (not `customfield_10016`) in issue responses; use `customfield_10016` in JQL but read `customfield_10024` from results |

Note: in JQL, `customfield_NNNNN` is written as `cf[NNNNN]`.

> **JQL limitation — Team field filtering:** Filtering by team (`cf[10001]`
> or `"Team[Team]"`) combined with a `sprint =` clause returns no results
> due to a Jira API limitation on this instance. **Workaround:** omit the
> team filter from JQL, fetch all sprint items, then filter locally by
> `customfield_10001.name` in the returned JSON.

## Timeboxes

| Timebox | Duration | Jira representation |
|---------------|-----------|-----------------------------------------------------|

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|---------------|-----------|-----------------------------------------------------|
|---|---|---|

| LTS Cycle | ~2 years | FixVersion e.g. `26.04 LTS` |
| Release Cycle | ~6 months | FixVersion e.g. `26.10` |
| Pulse | 2 weeks | Sprint, named `Pulse YYYY#nn` e.g. `Pulse 2025#01` |

- Pulse is the internal name for a Jira sprint — all Canonical teams share
the same sprint numbering. `#nn` is the sequential sprint number for the
year.
- Roadmap Items are Epics with `customfield_10615 = "Roadmap Item"` plus a
release label (e.g. `26.10`).
- Uncompleted Roadmap Items are carried over: new label added, FixVersion
updated.

## Issue States

`Untriaged` → `Triaged` → `In Progress` → `In Review` → `Done`
(or `Blocked` / `Rejected`)

- Parent chain must be marked Triaged before a child can be Triaged.
- Parent chain should be marked In Progress when a child moves to In Progress.
- Parent is Done only when all children are Done.

## Metrics & Targets

| Metric | Target | Current (approx.) |
|------------------------------------|--------|-------------------|

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|------------------------------------|--------|-------------------|
|---|---|---|

| Pulse velocity | ≥ 80% | ~60% |
| Untriaged issues in active timebox | 0% | significant debt |
| Issues without team/component | ~0 | - |
| Epics without t-shirt size | 0 | - |
| Epics without parent Objective | 0 | - |

## Backlog Grooming Owners

| Backlog | Who grooms |
|-----------------|-------------------------------------|

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|-----------------|-------------------------------------|
|---|---|

| Full backlog | Director + senior leads |
| Product (LTS) | Seniors, architects, SMEs |
| Release (Cycle) | Assigned objective lead, Epic owner |
| Pulse | Everyone / issue owners |

## Practice References

For full lifecycle rules, grooming checklists, and interrupt workflows:

- Objectives → `practices/objectives.md`
- Epics → `practices/epics.md`
- Pulse items (Stories / Tasks / Spikes) → `practices/pulse.md`
64 changes: 64 additions & 0 deletions jira/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Jira Agent Tooling

This directory is the working root for AI-assisted Jira workflows on the
Dektop team. Open it as your project folder in OpenCode to get full
agent context, skills, and practices automatically loaded.

## Prerequisites

- [OpenCode](https://opencode.ai) installed
- Jira MCP configured for `warthogs.atlassian.net`
- Cloud ID: `220bceb6-6b32-4813-90eb-68d67c9445db`
- The MCP server must be listed in your OpenCode config
(`~/.config/opencode/config.json`)

## Quick Start

```bash
git clone https://github.com/canonical/desktop-engineering
cd desktop-engineering/jira
opencode
```

On first run, tell the agent your role so it loads the right persona:

> "I am a squad lead" — loads `personas/squad-lead.md`
> "I am the director" — loads `personas/director.md`
> "I am a developer" — loads `personas/developer.md`

The agent will automatically read `AGENT.md` for team context (Atlassian
config, custom fields, issue hierarchy, metrics targets).

## Available Skills

Skills are loaded automatically from `.opencode/skills/`. Each skill provides
the agent with a focused workflow for a specific task.

| Skill | Trigger phrases | What it does |
|--------------|-----------------|-----------------------------------------------------|

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|--------------|-----------------|-----------------------------------------------------|
|---|---|---|

| *(none yet)* | — | Skills are being developed — see Contributing below |

## Practices

Detailed lifecycle rules, grooming checklists, and interrupt workflows:

| Document | Covers |
|---------------------------|--------------------------------------------------------------------------------------------------------|

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
|---------------------------|--------------------------------------------------------------------------------------------------------|
|---|---|

| `practices/objectives.md` | Objective creation, grooming → Triaged, state transitions, carry-over, interrupts |
| `practices/epics.md` | Epic creation, grooming → Triaged, child items, state transitions, carry-over, interrupts |
| `practices/pulse.md` | Story / Task / Spike creation, sizing, sprint assignment, pulse planning, velocity |

## Personas

| File | For |
| -------------------------- | ------------------------------------------------------------------------------------------ |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
| -------------------------- | ------------------------------------------------------------------------------------------ |
| --- | --- |

| `personas/director.md` | Director / Product Owner — LTS Objectives, cross-squad prioritisation, interrupt triage |
| `personas/squad-lead.md` | Squad Leads — Release backlog, Epic ownership, pulse health per squad |
| `personas/developer.md` | Individual Contributors — pulse delivery, Epic ownership, velocity, blockers |

## Contributing

- Practice changes (grooming rules, checklists): edit `practices/*.md` and open a PR
- New skills: add a directory under `.opencode/skills/` with a `SKILL.md` and any supporting scripts
- Persona updates: edit `personas/*.md` — keep role-specific context current after each cycle
- Discuss on [`#dekstop-team-eng`](https://chat.canonical.com/canonical/channels/desktop-team-eng)
140 changes: 140 additions & 0 deletions jira/personas/developer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
# Persona: Developer / Individual Contributor

Individual contributors own the delivery of pulse items and the quality of
their assigned Epics. This persona is for any Foundations team member who is
not acting as a squad lead or director.

---

## Primary Responsibilities

- **Pulse delivery**: complete assigned Stories, Tasks, and Spikes within the
Pulse; target ≥ 80% of your committed story points done each sprint
- **Own your Epic quality**: for any Epic you own, ensure it meets grooming
criteria before and during the cycle — description, t-shirt size, parent
Objective, team field, and a docs Story child
- **Proactive blocking**: flag blockers to your squad lead the moment they
appear — do not wait until the Pulse review
- **WIP discipline**: finish in-progress items before picking up new ones;
keep your active item count low
- **Triage hygiene**: keep your assigned items free of dangling Untriaged
work — everything in an active Pulse should be Triaged or beyond

## Decision Authority

| Decision | Authority |
| -------- | --------- |

@sergio-costas sergio-costas Jun 17, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would limit the number of dashes to the bare minimum in MD (three) to take into account people that uses screen readers. This way it would reduce the number of bar dash dash dash dash dash dash bar dash... read by it.

Suggested change
| -------- | --------- |
| --- | --- |

| Create a Story / Task / Spike under your Epic | You |
| Estimate story points on your items | You (with squad lead input) |
| Move an item to In Progress / In Review / Done | You |
| Flag an item as Blocked | You — notify squad lead immediately |
| Carry over an item to the next Pulse | You + squad lead awareness |
| Create a new Epic | You + squad lead sign-off to triage it |

---

## Typical Agent Prompts

### My current pulse

```
Show all my active pulse items in the current sprint — flag any missing
story points, assignee, or parent
```

### My Epic health

```
Assess grooming quality for all Epics assigned to me — flag missing fields
or child items
```

### What should I pick up next?

```
Show all Triaged Stories and Tasks assigned to me that are not yet in a
sprint, ordered by parent Epic priority
```

### Carry-over check

```
Which of my items from the previous Pulse are still open? Should any be
re-estimated or closed?
```

### Create a new pulse item

```
I need to create a Story under Epic FR-XXXX to [description]. Help me write
a well-formed description with Why, Who, What, and How.
```

### Check my velocity

```
What is my pulse velocity for the last 3 sprints? How does it compare to
the 80% target?
```

### Blocker

```
UDENG-XXXX is blocked — [describe blocker]. Help me write a clear blocker
comment and identify who can unblock it.
```

---

## Pre-baked JQL Queries

### My active pulse items

```
assignee = currentUser() AND issuetype in (Story, Task, Spike)
AND sprint in openSprints() AND statusCategory != Done
ORDER BY status ASC
```

### My untriaged items

```
assignee = currentUser() AND status = Untriaged
AND statusCategory != Done ORDER BY created ASC
```

### My Epics (owned)
```
project in (UDENG) AND issuetype = Epic AND assignee = currentUser()
AND statusCategory != Done ORDER BY status ASC
```

### My Epics missing grooming fields

```
project in (UDENG) AND issuetype = Epic AND assignee = currentUser()
AND statusCategory != Done
AND (cf[10040] is EMPTY OR cf[10001] is EMPTY)
```

### Items I own that are blocked

```
assignee = currentUser() AND status = Blocked ORDER BY updated ASC
```

### Items assigned to me not yet in a sprint

```
assignee = currentUser() AND issuetype in (Story, Task, Spike)
AND sprint is EMPTY AND statusCategory != Done ORDER BY created ASC
```

---

## Practice References

- Pulse items (your day-to-day): `practices/pulse.md`
- Epic lifecycle (if you own Epics): `practices/epics.md`
- Objective lifecycle (read-only): `practices/objectives.md`
- Team context, custom fields, timeboxes: `AGENT.md`
Loading
Loading