agentleFS
JeanKadangJeanKadang/DOC-GitHub-Practice-Skills/skills/github-for-ado-users/SKILL.md

github-for-ado-users

Skill1 starsChanged 45 days agoMITView on GitHub

Use when someone coming from Azure DevOps, TFS, Jira, or another tracker asks how a concept maps to GitHub — "what's the GitHub equivalent of a sprint / epic / work item type / area path / component / fix version / query (WIQL or JQL)", "where do sprints go", why milestones don't behave like iterations, how Jira or Azure Boards (AB#) and GitHub link, where a wiki or test plan should go, or how to set up GitHub tracking the way they had it in ADO or Jira.

The file

We split this skill into the rules it gives an agent

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

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    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 this repository's colleague-training program is available, its education/0_prerequisites/module-0-1-what-is-version-control.md (this …

    line 22
  2. Distinctive:

    If you want both — you probably do — run milestones for releases and an iteration field on the board for cadence.

    line 65
  3. Distinctive:

    Use Discussions for the conversational content that would have been a wiki page in ADO (how-do-I, RFCs, announcements).

    line 103
  4. Very specific:

    Where it works: put AB#125 in a commit message, a pull request description or an issue description, push or save, and the work item shows …

    line 162
  5. Very specific:

    Keep one source of truth for each piece of work: planning and status in Azure Boards, code and review in GitHub, the AB# mention in the …

    line 181

≈ “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

GitHub for Azure DevOps migrants

GitHub and ADO cover the same ground with a much smaller feature set. The danger is not the concepts that are missing — those are obvious. It is the ones that map almost, where a familiar word means something different and the process quietly breaks weeks later.

If your team's Azure DevOps or TFS project uses TFVC rather than Git repos, everything below is the wrong layer to start at. This mapping table is GitHub-vs-ADO process vocabulary — work items, boards, pipelines. TFVC vs Git is a different, more fundamental jump: TFVC checks files out from one central server one at a time, and only one person can hold the lock on a file at once; Git gives every clone the entire history, and every commit happens locally, before anyone pushes anywhere — there's no central lock to wait for. No amount of relabeling nouns bridges that gap; it has to be learned as its own concept before the table below is useful. If this repository's colleague-training program is available, its education/0_prerequisites/module-0-1-what-is-version-control.md (this repository only) covers the concept in plain terms — but the two sentences above are enough to name the jump even without it.

The single most expensive mistake (once you're on Git): treating milestones as sprints. See below.

Mapping table

Azure DevOpsGitHubNotes
Work ItemIssueStraight mapping
Work Item Type (Bug/Task/Feature)Issue TypesReal first-class field, but org-only — personal accounts get labels instead
Iteration / SprintProjects iteration fieldNot milestones. See below
Area PathLabelsFlat, not hierarchical — encode area as area:auth if you need the prefix
Epic → Feature → StoryEpic issue + native sub-issuesOne practical nesting level; don't rebuild three tiers
BoardsProjects v2A view over issues, never the source of truth
BacklogIssue list, ordered by priority labelNo ranked backlog with drag-order outside a board
Queries (WIQL)gh issue list --search, Projects saved viewsFar weaker; no cross-repo query language
Wikidocs/ in the repoGitHub's Wiki exists, but don't start a new one; see below
PipelinesActionsYAML in .github/workflows/
Branch policiesRulesetsSupersede branch protection; gh ruleset is view-only
Pull RequestPull RequestStraight mapping
Release pipelineReleases + a tag-triggered workflow
Test PlansNo equivalentGenuine hole — plan for it
DashboardsProjects charts (weak), or nothingInsights are thin by ADO standards
Service hooksWebhooks / Actions
Delivery PlansNo equivalent

The three traps

1. Milestones are not sprints

A milestone is a delivery bucket — a release, or a phase. It closes when the thing ships. It has a due date, which makes it look like an iteration, and that is the trap.

Time-boxed iterations belong in a Projects iteration field. Using milestones as sprints leaves a graveyard of stale, half-empty Sprint 14 milestones that nobody closes, and destroys the one thing milestones are good at: answering "what is in the next release?"

If you want both — you probably do — run milestones for releases and an iteration field on the board for cadence. They are different axes, like priority and milestone. Note that the iteration field cannot be created from the CLI (gh project field-create supports only TEXT, SINGLE_SELECT, DATE, NUMBER); use the web UI or a GraphQL mutation. See github-projects.

2. Issue types are org-only

gh issue create --type Bug sets a first-class type, separate from labels — the closest thing to a Work Item Type. But issue types are defined at the organization level. On a personal account the API returns 404 and the flag has nothing to select:

gh api "orgs/<org>/issue-types" --jq '.[].name'    # 404 on a personal account

On a personal repo, encode the type as a category label and move on. If you are setting up an org, define issue types early — retrofitting them across an existing backlog is manual. Keep them coarse (Bug, Feature, Task, Epic); the priority and area axes stay on labels.

3. A new Wiki is a trap; an established one is not

GitHub's Wiki is a separate git repo with no pull requests, no review, no CI, and no coupling to the branch that changed the behaviour it documents. For a repository with no Wiki in use, docs that matter go in docs/ in the repo, where they are versioned with the code, reviewed in the same PR, and greppable. Don't enable a Wiki to hold them.

That is a rule about starting one, not about an existing one. Azure DevOps also has a Git-backed project Wiki, so a team arriving with an established, actively-used Wiki (here or there) may keep it: leave it alone and treat its content as the source of truth for what it covers, as github-repo-bootstrap does. If they are migrating because the wiki sprawled unreviewed, that is the moment to suggest docs/, but it is a call about their wiki, not about wikis in general.

Use Discussions for the conversational content that would have been a wiki page in ADO (how-do-I, RFCs, announcements).

What GitHub has that ADO does not

Discussions is the one to actually learn. ADO has no equivalent, so migrants tend to keep putting exploratory work into issues, where it rots as a stale never-closeable ticket.

  • Discussion = exploring. Threaded, votable, answer-markable, no assignee, no "when will this be done."
  • Issue = committed to doing. Assignee, priority, milestone.
  • Converting a discussion to an issue is the moment exploration became commitment — that boundary is the whole value.

Categories worth having: Ideas, Q&A, RFC, Announcements.

Caveat: gh discussion is in preview and subject to change. Script against the GraphQL API if you need stability; the web UI is fine for humans.

Also new relative to ADO: CODEOWNERS (automatic review routing by path), Dependabot (dependency PRs raised for you), auto-generated release notes, and native sub-issues.

The traceability chain

The consistency that ADO gave you through work-item links, GitHub gives through one chain. Every change follows it, and each link is enforced by the tool rather than by discipline:

issue (#N, priority + category labels, milestone)
  → gh issue develop <N>        # branch created AND linked to the issue
  → PR with "Refs #N"           # links partial or in-progress delivery
  → criteria + evidence reviewed # acceptance contract must pass
  → change "Refs" to "Closes"   # completed issue may now auto-close
  → milestone                   # groups the release
  → auto-generated release notes # built from merged PRs

Break any link and traceability is back to human memory. gh issue develop is the one most often skipped and the one that does the most work — it is the equivalent of creating a branch from a work item in ADO.

GitHub does not enforce acceptance criteria the way a configured ADO process can. Closes #N merely changes state when the PR merges; it does not evaluate a checkbox. Treat each criterion as part of the work: map it to concrete evidence, check it only when satisfied, and keep Refs #N plus an open issue while any in-scope criterion is unmet or unevaluated. Scope changes require a recorded decision, not a checkbox that falsely implies delivery. The exact merge and closure gate lives in github-hygiene.

Keeping Azure Boards next to GitHub

Many teams move the code first and keep Azure Boards for planning. The two link through the AB# mention, which needs the Azure Boards project to be connected to the GitHub repository first (the Azure Boards app for GitHub, with Contributor access to both). Without the connection a mention links nothing.

  • Where it works: put AB#125 in a commit message, a pull request description or an issue description, push or save, and the work item shows the link in its Development section.
  • Where it does not: Microsoft's documentation says an AB# in a comment or in a pull request title does not create the link. A user who put it in the title and sees nothing has not found a bug.
  • State words move work items. A word such as fix, fixes, fixed or a state name before the mention (Fixes AB#125, Closed AB#125) also transitions the work item, but only when the pull request merges into the default branch. With several mentions, only the first is transitioned unless each one has its own word.

Do not combine the two closures. Fixes AB#125 moves the Azure Boards work item on merge in the same way Closes #N closes a GitHub issue: neither checks the acceptance criteria. Treat it like Closes. Use the bare AB#125 (link only) while any criterion lacks evidence, and add a state word only once the evidence is recorded and the maintainer has approved the closure. The closure gate lives in github-hygiene.

Keep one source of truth for each piece of work: planning and status in Azure Boards, code and review in GitHub, the AB# mention in the description. Copying every work item into a GitHub issue gives two records that drift. Connecting the same repository to projects in more than one Azure DevOps organization can produce unexpected links, so connect it to one. Azure DevOps Server (on premises) supports GitHub Enterprise Server only; this section does not cover that setup.

Source, read 2026-10-11: Microsoft Learn, Link GitHub commits, PRs, branches, and issues to work items (page dated 2026-07-16). Re-check it before relying on a claim for a decision that is hard to undo.

Coming from Jira

Jira is not Azure DevOps, so the table above is the wrong starting point for a Jira user. Atlassian's current documentation says work item where this section says Jira issue, and space where it says Jira project; people still use both words, so accept either. The mapping below was checked against the vendor pages listed at the end on 2026-10-10. Re-check a claim before relying on it for a decision that is hard to undo; both vendors change these features.

JiraGitHubWhere it differs
Space key plus number (PROJ-123)Issue number (#123), unique per repositoryThere is no project prefix. Across repositories write owner/repo#123.
Epic, Story, Task, BugIssue types (org-only; defaults are task, bug and feature, up to 25)GitHub has no built-in "epic" level. Use an issue type or label plus sub-issues.
Sub-taskSub-issueUp to eight levels and 100 per parent, and a sub-issue can sit in another repository. Jira's default is three fixed levels; do not rebuild more than you need.
Scrum board and sprintProjects board plus an iteration fieldAn iteration has a length in days or weeks, a start date and optional breaks, like a sprint. It is not a milestone; see trap 1.
Workflow status (To Do, In Progress, Done)A single select field on the Projects board, such as StatusThe issue itself is only open or closed. Check which Jira workflow rules the team relies on; none carry over by themselves.
Resolution (Done, Won't do, Duplicate)The close reason on an issue (completed, not planned, duplicate)Set when closing, and searchable with reason:.
PriorityA priority labelPriority is not a built-in field on an issue.
ComponentLabel such as area:authFlat, like Area Path.
Fix versionMilestoneA release bucket that closes when it ships.
Affects versionA field in the issue form, or a labelThere is no built-in field.
JQLIssue search qualifiers, and Projects saved viewsSearch combines qualifiers with AND, OR and parentheses (label:, no:, reason:, type:, milestone:) and can be limited to an owner. It is not a query language with functions.

Linking the two products. The GitHub for Atlassian app connects a GitHub Cloud organization to a Jira Cloud site: a Jira site administrator and a GitHub organization owner must both approve it. Once connected, a Jira key in a branch name, a commit message or a pull request title links that work to the Jira item, and its development panel then shows the branches, commits and pull requests (workflows and deployments can be linked too). Smart commits can also comment on an item, log time or move its status from a commit message; new repositories in a linked account have them enabled by default, and Atlassian warns that a commit can be attributed to someone other than the person who pushed it, so some organizations switch them off.

What not to promise. Atlassian's documentation describes development information flowing into Jira. It does not describe syncing GitHub issues with Jira items or carrying statuses between them, so never tell a user the two stay in step. If the team plans in Jira, keep one source of truth for each piece of work: planning and status in Jira, code and review in GitHub, with the key in the branch name and the pull request title. Mirroring every Jira item as a GitHub issue creates two records that drift. GitHub Enterprise Server connects through a separate process that this section does not cover.

The closure gate does not change: a criterion is met when its evidence is recorded, wherever the criteria live. This repository's own conventions (Refs #N, gh issue develop) assume GitHub issues; for work tracked in Jira, put the key where the tooling looks for it and the evidence in the pull request.

Sources, read 2026-10-10: Atlassian Support pages on work item keys, the work type hierarchy, statuses, priority and resolution, sprints, versions, JQL, connecting GitHub, linking development work and smart commits; GitHub Docs pages on iteration fields, sub-issues, issue types and issue search.

Setting up a repo the way you had it in ADO

Rough order, with the skill that covers each:

  1. Labels (priority + category) — github-issue-first
  2. Issue types, if you are in an org — github-issue-first
  3. Milestones for releases, not sprints — github-releases
  4. Ruleset on the default branch (required checks + review) — github-releases
  5. Issue forms and PR template — github-repo-configure; CODEOWNERS and CONTRIBUTING.md — github-repo-bootstrap for a new repository, github-repo-review to audit an existing one
  6. .github/release.yml for categorised release notes — github-releases
  7. Projects board only if more than one maintainer — github-projects
  8. Discussions enabled, with categories

Common mistakes

MistakeFix
Milestones used as sprintsMilestones = releases; iterations = Projects iteration field
Rebuilding Epic→Feature→Story as three issue levelsEpic + sub-issues, one level
Expecting gh issue create --type to work on a personal repoIssue types are org-only; use labels
Starting a new GitHub Wiki for docsdocs/ in the repo — versioned, reviewable, greppable (an established, actively-used Wiki can stay)
Exploratory ideas filed as issuesDiscussions; convert when it becomes actionable
Looking for Test PlansNo equivalent — decide where test cases live before you need them
Expecting WIQL-grade queriesgh issue list --search + Projects views; plan for less
A board as the source of truthThe board mirrors issues; labels and milestones are authoritative
Assuming a merged PR means its issue met acceptance criteriaReview every criterion with evidence; use Refs #N until the completion contract passes
Telling a Jira user that GitHub issues and Jira items stay in syncThe connection carries development information into Jira only; keep one source of truth per piece of work
Writing Fixes AB#125 in a PR description before the evidence is recordedIt moves the work item on merge and checks no criterion; use bare AB#125 until the closure gate passes
Putting AB#125 in a PR title or a comment and expecting a linkIt links only from a commit message, PR description or issue description, and only once the project is connected to the repository
Using a Jira user's mapping from the Azure DevOps tableUse "Coming from Jira": fix versions are milestones, components are labels, sprints are iterations

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.