Jira brief intake
Skill eugenelim/agent-ready-repo/packs/atlassian/.apm/skills/jira-brief-intake
Use this skill when the user points at a Jira epic (or a board / sprint / JQL selection of issues) and wants it turned into shippable specs -- "turn PROJ-100 into specs", "decompose this epic", "we plan kanban-style in Jira, break this epic into a product brief". The skill pulls the epic and its children via the `jira` skill, maps them onto a product brief (epic -> Outcome, child issues -> Shape B user stories tagged with their Jira key, epic key -> `Epic:` pointer), writes it to `docs/product/briefs/<slug>.md`, and hands off to the `receive-brief` skill to elicit gaps, decompose, and build. Do NOT use for a single feature (use `new-spec`) or a defect (use `jira-defect-flow`).From its SKILL.md
npx -y skills add eugenelim/agent-ready-repo --skill jira-brief-intakeAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 15 stars15 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
12.9 KB, ~3.2k tokens by cl100k_base, as published. Nobody here has run it
Skill: jira-brief-intake
This is choreography, not invention. It is the adapter between a tracker and the brief-intake pipeline, for teams that keep the what/why of a body of work in a Jira epic and its child issues rather than in a written brief. It composes two things that already exist:
jiraskill (sibling in this pack) — every Jira read. You never write a raw Jira REST call here, and this skill is read-only: it never transitions, comments, attaches, creates, updates, or deletes.receive-briefskill (shipped by the host repo'scorepack; resolved by name through the harness) — the brief inbox: it elicits missing load-bearing fields conversationally, decomposes the brief into independently-shippable slices, and executes each throughnew-spec→work-loop. This skill does not re-explain or re-implement any of that — least of all elicitation. It assembles the brief from Jira and hands off.
The one thing this skill owns is the Jira → brief mapping that neither side
can do alone: receive-brief knows nothing about Jira, and jira knows
nothing about briefs. If you find yourself writing a Jira REST call, or
interrogating the user for a missing Outcome, stop — the first belongs in
jira, the second in receive-brief.
Cross-skill invocation — name, not path
This skill names sibling skills (jira, receive-brief, new-spec) by
their name: field, never by path. Install locations vary by IDE and scope,
and skills can be renamed at install time. Path coupling silently breaks every
alternative layout.
The contract: when this skill says "via the jira skill: get-issue $KEY ...", the agent uses its native skill-dispatch mechanism to invoke the skill
registered under that name with those arguments. In Claude Code that's the
Skill tool (/<skill-name> or programmatic dispatch); in other IDEs it's the
equivalent. If you find yourself writing ~/.claude/skills/jira/... or any
other hardcoded path here, stop — look up the skill by name instead.
Install guidance for the named dependencies lives in manifest.json under
deps.skills — that's a where to get them hint, not a runtime path.
Prerequisites
Before stage 1, confirm two things — they behave differently:
-
jirais installed and authenticated — a hard dependency. Invoke it:jira: check.- Exit 0 → proceed.
- Exit 2 → the user must act. Tell them to run
credential-setupthemselves (it's interactive — do not run it for them), then stop. Do not dispatch any read into an auth failure. - There is no degraded path without
jira— it performs every read this skill depends on.
-
receive-briefis installed — a soft dependency. Probe whether your harness can dispatch a skill registered under the namereceive-brief.- Present → the normal flow (stage 3 hands off to it).
- Absent → the graceful-degradation flow (stage 4). You still produce the brief; you just inline the decompose/execute instruction instead of handing off. Decide this now so stage 2 knows which shape to write.
Lifecycle
Stage 1 — Intake: pull the epic and its children
Fetch the epic with the fields a brief needs, via the jira skill:
get-issue $EPIC_KEY --fields "summary,description,labels,issuetype,status" --expand renderedFields
Then enumerate its children. Jira has no single "get children" verb, and the
parent↔child relationship is named differently across flavors — so query both
forms through the jira skill's search and use whichever returns issues:
# Cloud team-managed projects use `parent`:
search "parent = $EPIC_KEY ORDER BY created ASC" --fields "summary,description,issuetype,status"
# Server / Data Center and company-managed Cloud use the "Epic Link" field:
search '"Epic Link" = $EPIC_KEY ORDER BY created ASC' --fields "summary,description,issuetype,status"
"Epic Link" does not exist on team-managed Cloud and a JQL referencing it
errors there; parent is empty for an epic on company-managed/Server. Try one,
and fall back to the other when it errors on a missing field or returns
zero rows. Never assume a single form — silently returning zero children is the
failure this guards against.
Other intake shapes (kanban teams often have no epic):
- A board / sprint / JQL selection instead of an epic: the user gives you a
JQL (or a saved-filter / board scope). The matched issues become the brief's
stories. There is then no single parent to derive the Outcome from —
record that as a gap for
receive-briefto elicit (do not invent one). - A single non-epic issue with no children: that is one feature, not a
multi-feature brief. Stop and recommend
new-spec(and, if it's a defect,jira-defect-flow). Ask before treating it as a brief — do not force a one-ticket scope into the intake pipeline.
Stage 2 — Map to a Shape B brief
Write a draft brief to docs/product/briefs/<slug>.md, where <slug> is
kebab-case derived from the epic summary (it must match the filename and the
Brief: back-link receive-brief later stamps on derived specs). If core is
installed, copy its docs/product/briefs/_template.md; otherwise use the
carried shape below.
The Jira → brief mapping is Shape B (story-list), because an epic with children is a story list:
| Brief field | Jira source |
|---|---|
Outcome | the epic's summary + description, in the user's terms (the problem and what changes for them) |
Scope / Non-goals | the epic description / labels, where stated — never invented |
Epic: pointer | the epic key (e.g. PROJ-100) — provenance back to the tracker, exactly what this field is for |
User stories (US-n) | one per child issue (below) |
Each child issue becomes one US-n line in this pinned format — the trace
receive-brief will complete with Satisfies: US-n on derived spec acceptance
criteria depends on it:
- **US-1.** (PROJ-101) As a <role>, I want <capability>, so that <benefit>.
- **US-2.** (PROJ-102) <child summary, carried verbatim when it isn't story-shaped>
The Jira key is a parenthetical immediately after the id — the slot the bare
template line leaves undefined. Reshape the child's summary into the
As a … I want … so that … grammar only when the source supports it;
otherwise carry the summary verbatim and let receive-brief refine it during
Elicit. Never invent a role or benefit the child issue does not state.
Leave Success metrics, Appetite, and any silent Scope to
receive-brief — surfacing and filling those gaps is its Elicit stage, not
yours. The Spec map's Status column is auto-derived downstream; leave it.
Stage 3 — Hand off to receive-brief (the normal flow)
Invoke the receive-brief skill by name, pointing it at the brief file you
just wrote. From here, receive-brief owns everything:
- Elicit — it ingests the brief and asks the user for any missing load-bearing field (Outcome, Scope). A thin epic is normal input; it elicits rather than rejects. Do not pre-empt this by interrogating the user yourself.
- Decompose — it cuts the stories into independently-shippable slices and surfaces the cut for confirmation.
- Execute — it chains
new-spec→work-loopper slice and stamps theBrief:/Satisfies: US-nback-links.
Your job ends at the handoff. Do not duplicate the Decompose/Execute stages.
Stage 4 — Graceful degradation (the receive-brief-absent flow)
When the Prerequisites probe found no receive-brief skill, do not stop —
you have still produced a useful brief. Inline the following instruction for the
agent to act on directly, and note that the downstream new-spec and
work-loop skills may likewise be absent (if core isn't installed, none
of them are) — fall back to the host repo's own spec/build process where they
are:
Decompose & execute (inlined because
receive-briefis not installed).
- Elicit the gaps. The brief above may be missing its Outcome or Scope. Ask the user for those load-bearing fields — do not invent them. Offer defaults for Success metrics / Appetite; never block on them.
- Decompose by shippability, not by component. Cut into slices each independently shippable and testable — one feature a build loop can carry end to end. Group the
US-nstories into slices. Flag any epic-sized story for splitting; flag any Outcome no slice covers as a gap.- Surface the cut and wait for confirmation before authoring any spec.
- Execute each confirmed slice through your repo's spec process (the
new-specskill if installed, else your repo's equivalent), then build it (thework-loopskill if installed, else your repo's loop). Stamp each derived spec with aBrief:back-link to this brief and aSatisfies: US-nmarker on the acceptance criteria that satisfy a story.
Carried brief shape (used only when core's _template.md is absent)
Keep this minimal — headings + the US-n line format, not a full copy of the
canonical template (which lives at docs/product/briefs/_template.md when core
is installed):
# Brief: <one-line outcome>
- **Slug:** `<slug>`
- **Received:** <YYYY-MM-DD>
- **Owner:** <who owns this repo's slice>
- **Epic:** <JIRA-EPIC-KEY>
## Outcome
<the problem and the user-facing outcome — LOAD-BEARING; elicit if the epic is thin>
## Success metrics
<observable signals; offer a default if absent>
## Scope / Non-goals
**In scope:**
-
**Non-goals:**
-
## User stories
- **US-1.** (JIRA-KEY) As a <role>, I want <capability>, so that <benefit>.
## Spec map
| Spec | Status |
| --- | --- |
| `<feature-slug>` | <auto> |
Don't
- Don't write a raw Jira REST call, or re-implement a
jirasubcommand. Ifjirais missing a read verb you need, extend that skill — don't shim around it. - Don't invoke any Jira write verb —
create-issue,update-issue,delete-issue,transition,comment,attach. Intake is read-only. (The one example showing these is the banned list, not a usage.) - Don't reimplement
receive-brief's Elicit stage. Do not interrogate the user for a missing Outcome or Scope — produce the brief and hand off (or, in the degraded path, hand the eliciting instruction to the agent). - Don't invent an Outcome, Scope, or story the Jira source doesn't state.
A thin epic is fine — surface the gap;
receive-briefelicits it. - Don't force a single ticket into a brief. One issue is one feature →
new-spec. A defect →jira-defect-flow. - Don't become a cross-repo coordination hub. Carry the epic key as the
Epic:pointer only; do not reimplement a tracker (own the slice). - Don't hardcode a sibling skill or template path. Look skills up by name.
Edge cases
- No epic, just a JQL/board scope. The matched issues are the stories, but
there's no parent for the Outcome. Record the missing Outcome as a gap and
let
receive-briefelicit it — don't fabricate one from the issue list. - Epic with zero children found. Confirm you tried both child-query forms
(stage 1). If genuinely empty, the epic is a one-liner with no decomposition —
ask the user whether it's really a single feature (
new-spec) or whether the children live under a different link type. - Child issues that are themselves epics (a hierarchy deeper than one
level). Flag them as epic-sized stories for splitting; don't silently flatten
a sub-epic into a single
US-n. - Custom fields hold the real scope (some teams keep acceptance criteria in
a custom field). Resolve names with
jira's--expand namesand map what's there; if the scope isn't in any field you can read, surface the gap. receive-briefpresent butnew-spec/work-loopabsent.receive-briefitself surfaces that gap when it tries to execute — you've done your job by handing off; don't pre-solve its downstream.
Examples
See references/examples.md for worked patterns: an
epic-with-children happy path, a JQL/board selection, the single-non-epic-issue
→ new-spec case, and the receive-brief-absent degraded path.
What ships with it: 3 files
9.6 KB alongside SKILL.md
evals/
- eval_queries.json1.5 KB
references/
- examples.md5.2 KB
- manifest.json2.9 KB