agentleFS
urvijain02urvijain02/claude-autopilot/skills/ticket-updates/SKILL.md

ticket-updates

Skill0 starsChanged 24 days agoMITView on GitHub

Jira status transitions + assignee, and the Slack notification, for the autopilot pipeline. Moves the ticket to its in-progress status at the start and its in-review status after PRs, assigns it to whoever is running the pipeline, and posts the PR link to the configured Slack channel. Used by the autopilot orchestrator.

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 0 are distinctive, and 3 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    If config.jira_transitions.<PROJECT> already records a target status name for this step, find the offered transition whose to.name matches …

    line 28
  2. Very specific:

    No hit → ask the user once, listing the offered status names, then write their answer to config.jira_transitions.<PROJECT>.<step> so later …

    line 33
  3. Very specific:

    Do not resolve a status by its statusCategory.

    line 38

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Ticket updates (Jira + Slack)

These are ticket-level actions — once per run, not per repo. If the relevant MCP isn't connected (see preflight), skip gracefully: log the skip in log.md, note it in the final block, continue the run.

Jira (Atlassian MCP)

cloudId comes from config.jira_site (e.g. yourcompany.atlassian.net). If it's unset or a call fails with a cloudId or permission error, resolve it with getAccessibleAtlassianResources and use that.

At run start (before requirements):

  1. Resolve the runner dynamically: atlassianUserInfo → account_id.
  2. Assign the ticket to that account: editJiraIssue with fields.assignee.accountId.
  3. Move it to the project's in-progress status (see Resolving a status below). If it's already there, skip.

After all PRs are open (before cleanup):

  1. Move it to the project's in-review status, resolved the same way.

Resolving a status

Status names differ per project, so never assume them. Call getTransitionsForJiraIssue and pick from what it actually offers:

  1. If config.jira_transitions.<PROJECT> already records a target status name for this step, find the offered transition whose to.name matches it case-insensitively and take it.
  2. Otherwise match to.name case-insensitively against the candidates for the step, in order, and take the first hit:
    • start → In Progress, In Development, Doing, Start Progress
    • review → In Review, Code Review, Review, Ready for review, Peer review
  3. Exactly one hit → use it and log a Decision: block naming the transition and why.
  4. No hit → ask the user once, listing the offered status names, then write their answer to config.jira_transitions.<PROJECT>.<step> so later runs are silent.
  5. Nobody to ask (running unattended) → skip the transition and log it. Never guess a status on someone else's board, and never force a transition the API didn't offer.

Cache the target status name, not the transition id: which transitions exist depends on where the ticket currently sits, so a stored id goes stale while a stored name can be re-resolved.

Do not resolve a status by its statusCategory. Categories are coarse (To Do / In Progress / Done) and workflows routinely put several statuses in one — a board can offer In Progress, In Review, Ready for test and Blocked all under the In Progress category, and land Ready for release under Done.

Slack (Slack MCP)

Channel: config.slack_channel — a channel id (e.g. C0…). If it's unset, skip the post and log it rather than guessing a channel. Post with slack_send_message once, after the PR(s) are open.

Format — a header line, then each PR URL on its own line (so Slack doesn't fold the link), with contributors / @-mentions excluded. Do not start the message with the ticket KEY — it's already in the PR title.

Single repo:

Ready for technical review — <PR title>
<PR URL>

Multi-repo (one header, one URL per line):

Ready for technical review — <short ticket summary>
<PR URL — repo A>
<PR URL — repo B>

Record the ticket's new status and the posted message link in state.json.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.