Chapter 05Lesson 01~165 minutes

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.

Work itemsIssuesLabelsMilestonesBoardsPlanning model

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.
Availability baseline (verified 2026-08-21). Issues/work items, ordinary project/group labels, milestones, and basic issue boards are documented for Free, Premium, and Ultimate on GitLab.com, Self-Managed, and Dedicated. Scoped labels, iterations, configurable work-item status, and epics are Premium/Ultimate. Iterations are group-level timeboxes. Epics are now exposed through the work-item model in current GitLab; the legacy Epics REST API is deprecated and GitLab 18.1+ documentation directs integrations to the Work Items API/GraphQL path. Board list/scope capabilities vary by tier. Always verify the current GitLab version/tier before relying on a planning field or API.

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

Planning record and derived 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.

Design rule: naming syntax is not enforcement. A label called 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?

When should you use a milestone rather than an iteration?

Can a Free learner rely on scoped-label mutual exclusion?

Why should new automation avoid the legacy Epics REST API?

Does a merge request that says “Related to #12” automatically close issue #12?

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

Next lesson

Operate a small GitLab Free backlog

Lesson 2 turns the mental model into a disposable workflow: create labels, a milestone, issues, a board, a branch, and a merge request reference, then prove every state transition from independent surfaces.

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.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0Send only Ethereum/ERC-20 compatible assets to this address.