Issues, Labels, Milestones, Iterations, Boards, Epics, and Work Planning: Concepts, Architecture, and Mental Model
Build a beginner-first mental model of GitLab work items, issues, labels, milestones, iterations, boards, epics, relationships, and planning scope before changing project work state.
Learning objectives
- Explain an issue/work item as the source record for planned work and distinguish it from Git branches, commits, merge requests, pipelines, and board cards.
- Distinguish labels, scoped labels, milestones, iterations, status, assignees, relationships, and hierarchy by the planning dimension each represents.
- Explain why a board is a view over issue/work-item metadata rather than a second copy of workflow state.
- Place project and group planning in the namespace model from Chapter 04 and identify tier-sensitive features such as iterations, scoped labels, status, and epics.
- Inspect planning state read-only before editing it and connect disciplined metadata to DevOps prioritization, release coordination, automation, reporting, and auditability.
1. The planning problem GitLab is solving
Code can be perfectly versioned while delivery remains chaotic. Teams still need to answer: What work exists? Who owns it? Which release or timebox does it belong to? What blocks it? What should happen next? GitLab planning features attach structured metadata and history to those questions.
Chapter 04 established who may act inside a namespace. Chapter 05 establishes what work exists and how its planning state is represented. The key beginner mistake is to treat every visual surface as its own data store. In GitLab, an issue card on a board, a milestone page, and an issue list are usually different views of the same underlying work-item metadata.
2. Work items and issues: one record, several views
flowchart LR W[Issue / work item source record] L[Labels] M[Milestone] I[Iteration Premium/Ultimate] A[Assignee] R[Relationships / hierarchy] B[Issue board view over metadata] LIST[Work-item / issue list] MR[Branch / merge request related delivery object] W --> L W --> M W --> I W --> A W --> R W --> B W --> LIST W -.references / closes.-> MR
The issue/work item stores identity, state, title, description, assignee and planning metadata. A board does not duplicate the issue. It selects and arranges items based on metadata such as labels, milestone, iteration, assignee, or status. A branch or merge request is a separate delivery object that can reference or close the work item.
Issue remains the familiar work unit for bugs, enhancements, and tasks of delivery. GitLab is increasingly standardizing planning objects under the broader work item architecture. Current interfaces can therefore say Plan → Work items even when you are filtering for Type = Issue. The underlying conceptual rule is stable: identify the work item type and its widgets/metadata instead of assuming every item is a legacy issue page.
3. Planning metadata is multi-dimensional
Good taxonomy uses each field for one question. Mixing dimensions creates ambiguous boards and brittle automation.
| Field | Question it should answer | Free-path example | Common misuse |
|---|---|---|---|
| Assignee | Who currently owns action? | One accountable learner | Using assignee as team/category metadata |
| Label | What kind/classification/workflow signal is this? | type-bug, flow-doing |
Encoding release dates and ownership into dozens of labels |
| Milestone | Which delivery goal/release window? | chapter05-demo |
Using one milestone as a permanent Kanban state |
| Iteration | Which recurring sprint/timebox? | Optional paid simulation | Treating an iteration as a release contract |
| Status | Which explicit workflow stage? | Free uses open/closed or labels | Assuming configurable status exists on Free |
| Relationship | What blocks/relates/parents this item? | Related branch/MR reference | Duplicating dependency text manually in descriptions |
4. Labels and scoped labels
Ordinary labels are available across tiers. Project labels apply within one project; group labels can be reused across projects in a group hierarchy. Labels are useful because lists, boards, API filters, and automation can all read the same classification.
Scoped labels use a scope/value convention such as
workflow::ready and workflow::doing. On
supported Premium/Ultimate tiers, labels in the same scope are
mutually exclusive: assigning one can replace the other. A Free
learner may still use descriptive ordinary labels such as
flow-ready and flow-doing, but should not
claim GitLab is enforcing mutual exclusivity.
workflow::doing on a tier without
scoped-label behavior is still just a name. Verify the current tier
before relying on replacement semantics.
5. Milestones versus iterations
Milestones are Free across offerings and can exist at project or group scope. They are well suited to releases, delivery goals, or larger windows. A work item or merge request can be associated with one milestone, and the milestone aggregates progress.
Iterations are Premium/Ultimate group-level recurring timeboxes, commonly used for sprints. They belong to iteration cadences, require start/end dates, and are designed to repeat. GitLab’s own guidance treats milestones and iterations as complementary: for example, a multi-week release milestone can contain several shorter sprint iterations.
Do not invent an iteration on Free by calling a milestone “iteration” and then teach it as product behavior. A free simulation can model the planning intent, but the lesson must label the difference.
6. Boards are projections over metadata
An issue board presents cards in lists. Depending on tier and configuration, a list can represent a label, milestone, iteration, assignee, or status. Dragging a card is meaningful because GitLab changes the underlying item metadata that corresponds to the list. For a label-list board, moving a card can remove one workflow label and add another. The card itself is not a separate work record.
This explains a powerful verification technique: after moving a card, leave the board and inspect the issue directly or query the Issues API. If the metadata changed as predicted, the board operation is proven. If the issue metadata did not change, your mental model or board configuration is wrong.
7. Epics and higher-level planning are evolving toward work items
Epics provide higher-level planning across work beneath a group and are Premium/Ultimate. In current GitLab, epics are represented through the work-item architecture. This matters for automation: the legacy Epics REST API is deprecated, and current GitLab documentation directs GitLab 18.1+ integrations toward the Work Items API/GraphQL model.
For a Free learner, the mandatory chapter does not require an epic. The correct free exercise is to maintain a small project backlog and then study a fixture showing how a higher-level epic would group issues across projects. That preserves the mental model without pretending the paid feature exists.
8. Project and group planning inherit namespace boundaries
A project issue belongs to one project. Project labels and project milestones are local. Group labels and group milestones can provide shared vocabulary or planning across descendant projects. Group issue boards can aggregate eligible items across projects below the group. This is where Chapter 04’s namespace hierarchy becomes operationally important: moving work planning to a group scope increases coordination power and also increases blast radius.
Cross-project planning should therefore be intentional. A group-wide
label named priority::critical or a group milestone can
standardize behavior across teams; an accidental or poorly owned
taxonomy can create reporting noise everywhere below the namespace.
9. Read-only inspection before mutation
Start by proving the project and planning state. These commands do
not print credentials; glab uses the authenticated host
established in Chapter 02.
# Run from a disposable project clone, or add -R GROUP/PROJECT explicitly.
glab auth status
glab repo view --output json --jq '{path_with_namespace,visibility,default_branch}'
# Human-readable backlog view.
glab issue list --all
# Machine-readable issue inventory. REST list responses are paginated.
PROJECT_ID="123456" # synthetic numeric ID
page=1
while :; do
batch="$(glab api "projects/$PROJECT_ID/issues?scope=all&state=all&per_page=100&page=$page")"
[ "$(printf '%s' "$batch" | jq 'length')" -eq 0 ] && break
printf '%s
' "$batch" | jq -c '.[] | {iid,title,state,labels,milestone:(.milestone.title // null)}'
page=$((page+1))
done
# Current project labels and boards.
glab label list --output json
glab api "projects/$PROJECT_ID/boards" --paginate --jq '.[] | {id,name,lists}'
For small labs, one page may be enough, but production inventory must not silently assume the first page is complete. The Issues API defaults to paginated results; selected endpoints also support keyset pagination in current GitLab.
10. Why planning metadata matters in DevOps
Planning metadata feeds prioritization, release readiness, automation, reporting, and audit evidence. A merge request can inherit labels/milestone from an issue; closing patterns can close work when code reaches the default branch; dashboards and boards summarize metadata; APIs let automation act on it. If labels have no owner, milestones mean different things to different teams, or automation mutates state without a clear contract, the delivery system becomes noisy even when the Git history is correct.
The production target is not “use every planning feature.” It is a small, documented metadata vocabulary whose fields have distinct meanings, owners, and verification paths.
Knowledge check
A card moves from Ready to Doing on a label-based board. What should change in the source record?
The issue/work item labels should change according to the board list semantics. Verify on the issue or through the API; the board card is only a view.
When should you use a milestone rather than an iteration?
Use a milestone for a release/delivery goal or larger bounded objective; use an iteration for a recurring group-level sprint/timebox when Premium/Ultimate is available.
Can a Free learner rely on scoped-label mutual exclusion?
No. Ordinary labels are Free, but scoped-label enforcement is Premium/Ultimate. Use a clearly labeled ordinary-label simulation on Free.
Why should new automation avoid the legacy Epics REST API?
GitLab deprecated the legacy Epics REST API and current GitLab 18.1+ guidance uses the work-item architecture/API path for epics.
Does a merge request that says “Related to #12” automatically close issue #12?
No. A non-closing reference records a relationship. Automatic closure requires a supported closing pattern and the required default-branch merge/commit behavior.
Summary
GitLab planning works best when one underlying work-item record carries deliberate metadata and every view is understood as a projection of that state. Issues/work items describe work; labels classify it; milestones group delivery goals; iterations timebox recurring work on paid tiers; boards visualize metadata; and epics provide paid higher-level hierarchy through the evolving work-item model.
Official references
- GitLab Docs — Work items
- GitLab Docs — Manage issues
- GitLab Docs — Labels
- GitLab Docs — Milestones
- GitLab Docs — Iterations
- GitLab Docs — Issue boards
- GitLab Docs — Manage epics
- GitLab Docs — Issues API
- GitLab Docs — Project issue boards API
- GitLab Docs — REST API pagination
- GitLab Docs — glab issue
- GitLab Docs — glab work-items list
- GitLab Docs — glab mr create
Keep the academy open
Support free, practical DevOps education.
Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0Send only Ethereum/ERC-20 compatible assets to this
address.