/sigma-create-ticket
Overview
/sigma-create-ticket files and edits SPEC, EPIC, and TICKET issues. It is the gateway for /sigma-to-spec and /sigma-to-tickets. /sigma-unslop does not call it.
This skill is the only one that runs gh issue create or gh issue edit. It does not implement, review, or merge.
Read CONVENTIONS.md before a create or an edit. That file holds title, label, and body detail.
When to Use
- Use when: the user invokes
/sigma-create-ticket, or/sigma-to-specor/sigma-to-ticketshands a body in this session. - List or view:
/sigma-to-specasks forlist-specs./sigma-to-ticketsasks forview. Run the read and return. Do not create. - Do not use when: the work is still a solution interview (
/sigma-plan), a spec (/sigma-to-spec), or a split (/sigma-to-tickets). Do not implement, review, or merge.
Input
A handoff has caller, action (list-specs, view, create, or update), kind (spec, epic, or ticket), title, body, and sometimes number, parent, and blocked-by.
The user's yes is a reply in this session. These replies count as yes, and they do not get a second question:
/sigma-to-specafter the user said yes to the digest/sigma-to-ticketsafter the user said yes to grain and blockers
Any other batch of 2 or more issues waits for a yes here.
Issue contract
- SPEC: title
SPEC: <name>, labelspec, no parent. Body: what this feature is, what it is not, acceptance ids, script globs underscripts/, out of scope. No open questions. - EPIC: title
EPIC: <name>, labeltype:epic. Parent is the SPEC. - TICKET: title
TICKET: <name>, labeltype:ticketplusagent:hitloragent:afk. Parent is an EPIC or the SPEC when/sigma-to-ticketsnames one. A ticket cut from a review has no spec parent unless that handoff names an epic. Body sections: Context, Acceptance, Out of scope, Branchagent/{N}-{slug}, Modehitlorafk.
Labels this skill ensures: spec, type:epic, type:ticket, agent:hitl, agent:afk. The Mode label matches the Mode line.
Steps
Step 1 - Resolve the work repo
Run gh repo view --json nameWithOwner. Done when it prints owner/name. If it fails, tell the user to run from the work repo or to run gh auth login, and stop.
If the repo name ends with sigma-build-factory, stop. Issues belong on the work repo.
Step 2 - Read or write
Read CONVENTIONS.md before a create or an edit.
list-specs runs:
gh issue list --repo "$REPO" --label spec --state all --limit 50 \
--json number,title,state,url,body
view runs gh issue view <N> --repo "$REPO" --json number,title,labels,state,url,body.
Return the JSON to the caller. Do not ensure labels and do not ask a question.
Done when the caller has the list or the issue, or the write path continues at Step 3.
Step 3 - Yes gate
A handoff from the three yes cases in Input is ready to file.
A direct batch (2 or more issues) with no yes in this session: show title, kind, parent, and Mode for each line. Ask once: "File these issues?" Wait. Silence does not file.
A direct single issue: ask once when title, kind, or a feature-lane parent is missing. When those fields are present, file.
An update with no yes in this session: show the issue number and title, ask once, then edit. Do not create a second issue.
Done when the yes is recorded, or a single complete create is ready to file.
Step 4 - Ensure labels
On the write path, list labels and create any missing name from the contract:
gh label list --repo "$REPO" --limit 100 --json name
gh label create <name> --repo "$REPO" --description "<from CONVENTIONS.md>"
Done when gh label list shows spec, type:epic, type:ticket, agent:hitl, and agent:afk.
Step 5 - Match an existing issue
List issues and compare the exact title SPEC: <name>, EPIC: <name>, or TICKET: <name>.
gh issue list --repo "$REPO" --state all --limit 200 --json number,title,state,url
A confirmed update edits that number. It does not create. If the new title is already on a different issue, stop that item and report both numbers.
A create that finds one exact title reports exists and reuses the number. It does not create a second issue and does not edit the body. Two exact titles stop that item.
Done when each item is create, update, reuse, or collision.
Step 6 - Create or edit
Write the body to a temp file. Do not write it into the work repo.
Set the title prefix when the short name lacks it. Do not double the prefix.
Create in order: epics before their tickets, blockers before dependents. Add --parent when the handoff names one. Add --blocked-by when the blocker numbers already exist. Omit each flag when it has no value.
gh issue create --repo "$REPO" --title "<title>" --label "<labels>" --body-file "$f"
Parse N from the URL. A ticket body whose Branch line is missing or still contains {N} is edited so the line is agent/<N>-<slug>. The slug is the name after the prefix, lowercase, spaces turned into hyphens.
gh issue edit <N> --repo "$REPO" --body-file "$f"
On a confirmed update, gh issue edit replaces title and body and fixes labels. Remove the other mode label so only the matching one remains. Do not change parent on edit.
A SPEC gets label spec only. An EPIC gets type:epic only. A TICKET gets type:ticket and the one mode label.
Log a gh failure and continue independent items. Do not create children of a failed epic. Do not close the parent.
Done when gh issue view <N> --json title,labels,body shows the title, the labels, and, on a ticket, Branch agent/<N>-<slug> with Mode matching the label.
Step 7 - Return
Return number, title, and URL for each item, including exists and failures.
When the caller is another skill, stop there. That skill names the next command. When the user invoked /sigma-create-ticket, name the next command and do not invoke it. A SPEC goes to /sigma-to-tickets <N>. A ticket goes to /sigma-implement <N>. For an epic, say that /sigma-implement refuses an epic.
Hard rules
| Rule | Why / violation looks like |
|---|---|
This skill is the only one that runs gh issue create or gh issue edit. List and view for the other skills run here too. | A second write path drifts title, label, and parent. |
| Ensure the five labels, then create or edit. | A missing label fails the next issue in the batch. |
| A confirmed update edits that issue. An exact title match does not create a duplicate. | A second SPEC: or TICKET: splits one feature. |
A direct batch waits for a yes. A body already confirmed by /sigma-to-spec or /sigma-to-tickets in this session does not get a second question. | Asking again stalls the handoff. Filing a direct batch on silence creates issues the user has not seen. |
After create, edit a ticket so Branch is agent/<N>-<slug>. The mode label matches the Mode line. | A leftover {N}, or afk with agent:hitl, sends the builder to the wrong branch or the wrong mode. |
| Set parent on create when the handoff names one. A ticket from a spec parents to an EPIC or the SPEC. A ticket from a review omits parent unless the handoff names an epic. | Inventing a spec parent copies acceptance the review ticket does not implement. |
| Do not implement, review, or merge. | This skill files the issue and stops. |
Verification
-
gh repo viewreturned the work repo, and the repo name does not end withsigma-build-factory. - CONVENTIONS.md was read before any create or edit.
-
list-specsandviewreturned JSON and did not create. - The five labels exist before create or edit.
- A direct batch had an explicit yes. An upstream yes in this session did not get a second question.
- A confirmed update edited the named issue. No second issue shares that exact title.
- A new ticket's Branch line is
agent/<N>-<slug>, and the mode label matches the Mode line. - An epic from a spec parents to that SPEC. A ticket from a spec parents to an EPIC or the SPEC. A ticket from a review has no spec parent unless the handoff named an epic.
- The return is number, title, and URL. This skill did not implement, review, or merge.