Design and implement processes and communications
Making work visible and traceable from idea to production, measuring the flow of delivery, and wiring the tools together so that humans find out what they need to know without drowning in noise.
- Traceability & flow of work — GitHub Flow, feedback cycles, work tracking, end-to-end traceability
- Metrics & queries for DevOps — DORA, flow metrics, dashboards, Analytics, per-discipline metrics
- Collaboration & communication — wikis, Mermaid, release notes, webhooks, Boards↔GitHub, Teams
This domain is tool-agnostic in principle but tool-specific in the questions. Expect to be asked whether a capability belongs to Azure Boards, GitHub Projects, or both.
1.1 Traceability & flow of work
GitHub Flow and the other flow models
GitHub Flow is a lightweight, branch-based workflow for teams that deploy continuously. There is exactly one long-lived branch (main), which is always deployable.
from main] --> B[Add commits] B --> C[Open a pull request] C --> D[Review & discuss
+ automated checks] D --> E[Deploy from the branch
to validate] E --> F[Merge to main] F --> G[Delete the branch] D -->|changes requested| B
| Model | Long-lived branches | Deploy model | Fits |
|---|---|---|---|
| GitHub Flow | main only | Deploy from the branch, then merge | Web apps, SaaS, continuous delivery |
| Trunk-based | main only | Deploy from main; feature flags hide unfinished work | High-maturity CD teams |
| Git Flow | main, develop (+ release/, hotfix/, feature/) | Scheduled releases cut from develop | Versioned/boxed software |
| Release Flow (Microsoft) | main + release/* | Branch per release, cherry-pick fixes forward | Multiple supported versions in production |
Caveat — GitHub Flow vs Git Flow
The single most reliable discriminator is the number of long-lived branches. GitHub Flow has one (main); Git Flow has at least two (main + develop). If the scenario says "release regularly / continuously deploy / keep it simple" → GitHub Flow. If it says "support multiple released versions / scheduled releases / QA hardening period" → Git Flow or release branching.
Feedback cycles
A "feedback cycle" is any loop that gets information back to the person who can act on it — the shorter the loop, the cheaper the fix.
| Mechanism | Purpose | Lives in |
|---|---|---|
| GitHub Issues | Bugs, features and tasks tied directly to code; labels, milestones, assignees | GitHub |
| GitHub Discussions | Open-ended Q&A and announcements that are not actionable work items | GitHub |
| PR reviews & required reviewers | Inline code feedback as a hard gate before merge | Both |
| CODEOWNERS | Auto-request the right reviewers based on the paths a PR touches | Both |
| Status checks | CI results surfaced on the PR itself | Both |
| Notifications / subscriptions | Route events to people and channels; tune to avoid alert fatigue | Both |
| Azure Boards | Planning-level feedback: epics, stories, sprints, boards | Azure DevOps |
Issues vs Discussions
An issue represents work that someone will eventually close by doing something. A discussion is a conversation with no defined completion. If a question asks where to put "community questions and feature brainstorming without cluttering the backlog", the answer is Discussions.
Integration for tracking work
Azure Boards work item hierarchy
| Level | Agile process | Scrum process | Basic process |
|---|---|---|---|
| Portfolio (top) | Epic | Epic | Epic |
| Portfolio | Feature | Feature | Issue |
| Requirement | User Story | Product Backlog Item (PBI) | Issue |
| Task | Task | Task | Task |
| Defect | Bug | Bug | Issue |
Azure DevOps ships four inherited process templates: Basic (default, simplest), Agile, Scrum and CMMI (adds formal change requests and risks). You customise by creating an inherited process — you cannot edit the system processes directly.
Linking commits and PRs to work items
The AB# syntax is the glue between GitHub and Azure Boards, and it is heavily tested.
# Link only (no state change)
git commit -m "Refactor the payment gateway AB#1234"
# Link AND transition the work item to its "completed" state on merge
git commit -m "Fix null reference on checkout fixes AB#5678"
git commit -m "Closes AB#199, implements AB#204"
- Transition keywords:
fix,fixes,fixed,close,closes,closed,resolve,resolves,resolved— used immediately before theAB#ID. - Inside Azure Repos the same idea uses a plain
#IDmention;AB#exists because GitHub already uses#for its own issues.
Caveat — AB# vs #
From a GitHub commit/PR to an Azure Boards work item → AB#1234. From within Azure Repos to a work item → #1234. A GitHub #1234 refers to a GitHub issue, not a work item. Getting this backwards is a classic distractor.
Azure Boards ↔ GitHub connection
- In Azure DevOps: Project Settings → GitHub connections → Connect your GitHub account.
- Authenticate — the Azure Boards GitHub App is the recommended method (scoped permissions, no personal token). OAuth and a PAT are the fallbacks.
- Select the repositories to connect. One GitHub repo can only be connected to one Azure DevOps project at a time.
- Use
AB#IDin commits, PR titles/descriptions and branch names to create links automatically.
Once connected you get: work-item links visible from the Development section of the work item, GitHub PR status shown on the Kanban card, and automatic state transitions on merge.
GitHub Projects
- Projects (the current version) is a flexible, spreadsheet-plus-board planning surface with table, board and roadmap views, custom fields (single-select, number, date, iteration), grouping, filtering and slicing.
- Items are issues, pull requests, or free-form draft issues that exist only in the project.
- Built-in workflows automate transitions — e.g. "when an item is closed, set Status to Done"; deeper automation uses the GraphQL API or GitHub Actions.
- Insights generates charts directly from project data (current and historical).
Boards or Projects?
Choose Azure Boards when you need a formal process template, portfolio-level rollup across many teams, rich query language (WIQL), Analytics/OData reporting or Test Plans linkage. Choose GitHub Projects when the work is code-centric, the team already lives in GitHub, and lightweight planning next to the repo is enough.
Source, bug and quality traceability
End-to-end traceability means you can start from any artefact and reach every other one:
requirement / bug] --> B[Branch] B --> C[Commit] C --> P[Pull request] P --> R[Build run] R --> T[Test results
+ coverage] T --> D[Deployment
to environment] D -.-> W
| Type | How you implement it |
|---|---|
| Source traceability | Link commits/PRs to work items (AB#); enforce with the branch policy "Check for linked work items" |
| Bug traceability | Create bugs directly from failing test results; link the bug to the failing build and the fixing PR |
| Quality traceability | Publish test results and code coverage from the pipeline; gate merges on build validation and coverage thresholds |
| Release traceability | Deployment records per environment; auto-generated release notes listing the work items and commits in each release |
Caveat — enforcing traceability
If a question asks how to guarantee that every change is tied to a requirement, the answer is a branch policy (Check for linked work items) in Azure Repos — not a convention, not documentation. Policies are the enforcement mechanism; AB# is just the syntax.
1.2 Metrics & queries for DevOps
DORA metrics — the four keys
| Metric | Measures | Elite performance | Category |
|---|---|---|---|
| Deployment frequency | How often you successfully release to production | On demand / multiple per day | Throughput |
| Lead time for changes | Commit → running in production | Less than one day | Throughput |
| Change failure rate | % of deployments causing a degradation needing remediation | 0–15% | Stability |
| Time to restore service (MTTR) | Incident start → service restored | Less than one hour | Stability |
Caveat — throughput vs stability
Two DORA metrics measure speed (deployment frequency, lead time) and two measure stability (change failure rate, time to restore). The research finding the exam leans on: high performers improve both together — speed and safety are not a trade-off. If a scenario says "we deploy faster but break more", the fix is better automated testing and smaller batches, not slowing down.
Flow metrics — cycle time vs lead time
New] --> B[Work started
Active] B --> C[Work done
Closed] A -. lead time .-> C B -. cycle time .-> C
| Metric | Definition | Improve it by |
|---|---|---|
| Lead time | Created → closed (includes backlog waiting time) | Reducing queue depth; prioritising ruthlessly |
| Cycle time | Started (first active state) → closed | Reducing handoffs, batch size and review latency |
| Throughput / velocity | Items (or points) completed per time period | Removing blockers; stable team capacity |
| Work in progress (WIP) | Items currently active | Enforcing WIP limits on board columns |
| Flow efficiency | Active time ÷ total elapsed time | Eliminating wait states between columns |
Little's Law
Cycle time = WIP ÷ throughput. This is why capping WIP is the fastest lever on delivery speed: with throughput roughly constant, halving work in progress halves cycle time. Expect a scenario phrased as "items sit in progress for weeks" — the answer is WIP limits, not more people.
Dashboards, widgets and Analytics
Azure DevOps reporting is built on the Analytics service, a read-optimised store fed from work-tracking and pipeline data. It is exposed three ways:
| Surface | Use for |
|---|---|
| Dashboard widgets | At-a-glance team metrics; configured in the UI, no query needed |
| Analytics views | A curated, filtered dataset published for Power BI consumption |
| OData queries | Ad-hoc/custom reporting against the Analytics endpoint (analytics.dev.azure.com) |
| WIQL (Work Item Query Language) | Querying current work item state — flat lists, tree and direct-links queries |
Caveat — WIQL vs Analytics/OData
WIQL answers "what does the backlog look like right now". Analytics/OData answers "how did this change over time" — trends, historical snapshots, burndown, cumulative flow. Any question containing "trend", "over the last N sprints", or "historical" points to Analytics, not a work item query.
| Widget | Answers |
|---|---|
| Velocity | How much did we complete per sprint (planned vs actual)? |
| Burndown / Burnup | Are we on track to finish the sprint or release? |
| Cumulative Flow Diagram (CFD) | Where is work piling up? (band widening = bottleneck) |
| Lead time / Cycle time | How long does delivery take, and how variable is it? |
| Test results trend | Is quality improving or decaying? |
| Code coverage | Is test coverage trending in the right direction? |
| Deployment status / Release pipeline overview | What is deployed where, right now? |
| Pipeline duration & pass rate | Is CI getting slower or flakier? |
Reading a Cumulative Flow Diagram
Each coloured band is a board column. A band that widens over time is accumulating WIP — that column is the bottleneck. The vertical distance between the top and bottom of the bands at a point in time is WIP; the horizontal distance between the same two lines is approximate cycle time.
Metrics by discipline
The skills measured list metrics for seven areas explicitly. Know a couple of representative metrics for each.
| Area | Representative metrics | Source |
|---|---|---|
| Project planning | Velocity, sprint burndown, epic/feature progress, WIP, planned vs completed | Azure Boards Analytics |
| Development | PR turnaround time, PR size, review depth, code churn, active branch count | Repos / GitHub Insights |
| Testing | Pass rate, flaky test rate, code coverage (line/branch), test duration, MTTD | Pipelines / Test Plans |
| Security | Open vulnerabilities by severity, mean time to remediate, secret-scanning alerts, Dependabot alert age | GHAS / Defender for Cloud |
| Delivery | Deployment frequency, deployment success rate, lead time, rollback rate | Pipelines / Environments |
| Operations | MTTR, availability/uptime, incident count by severity, change failure rate, error budget burn | Azure Monitor |
| Flow of work | Cycle time, lead time, throughput, flow efficiency | Azure Boards Analytics |
1.3 Collaboration & communication
Wikis and process diagrams
| Project wiki | Code wiki (publish as code) | |
|---|---|---|
| Backing store | A dedicated Git repo created for you (hidden from Repos) | A folder in an existing repo you choose |
| Editing | In the wiki UI, or by cloning the repo | Normal code workflow — branch, PR, review |
| Versioning | Single version | Multiple versions — one per branch/tag |
| Best for | Team notes, onboarding, meeting records | Docs that must ship and be reviewed with the code |
Caveat — which wiki?
If the requirement includes pull-request review of documentation, versioned docs per release branch, or "docs live with the code", the answer is publish code as wiki. Only one project wiki can exist per project; you can publish many code wikis.
Mermaid in wikis — the syntax differs by platform
Both platforms render Mermaid, but Azure DevOps wikis do not use fenced code blocks — they use a colon-delimited container. This distinction is directly examinable.
::: mermaid
graph TD
A[Developer] --> B[Push code]
B --> C{PR review}
C -->|Approved| D[Merge to main]
C -->|Changes| A
:::
```mermaid
graph TD
A[Developer] --> B[Push code]
B --> C{PR review}
C -->|Approved| D[Merge to main]
C -->|Changes| A
```
| Diagram | Opening keyword | Use for |
|---|---|---|
| Flowchart | graph TD / flowchart LR | Process and decision flows |
| Sequence | sequenceDiagram | Service/API interactions over time |
| Gantt | gantt | Release timelines and schedules |
| Class | classDiagram | Domain/system design |
| State | stateDiagram-v2 | Work item or entity state machines |
| User journey | journey | Experience mapping |
| Pie | pie | Simple proportional breakdowns |
Other wiki markup worth knowing
Azure DevOps wikis also support [[_TOC_]] (auto table of contents), ::: mermaid, work item mentions with #ID, @ person mentions, and ::: query-results embedding. GitHub Markdown adds task lists, footnotes, alerts (> [!NOTE]) and native Mermaid/GeoJSON rendering.
Release documentation
Auto-generated release notes
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: Create release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "${{ github.ref_name }}" \
--generate-notes \
--title "Release ${{ github.ref_name }}"
changelog:
exclude:
labels: [ignore-for-release]
categories:
- title: ⚠️ Breaking changes
labels: [breaking-change]
- title: ✨ Features
labels: [enhancement, feature]
- title: 🐛 Fixes
labels: [bug]
- title: Other changes
labels: ["*"]
- GitHub: Generate release notes builds the changelog from merged PR titles and authors since the previous tag;
.github/release.ymlcontrols grouping and exclusions. - Azure DevOps: query the build's associated work items and commits via the REST API (
build/builds/{id}/workitemsand/changes), or use a marketplace release-notes task; a build's associated items are computed from the previous successful build of the same pipeline.
API documentation
- OpenAPI/Swagger specs generated from code annotations (Swashbuckle for .NET, springdoc for Java) and published as a pipeline artifact.
- Azure API Management imports the OpenAPI spec and publishes a developer portal — automate the import as a release step so docs never drift from the deployed API.
- DocFX generates a documentation site from .NET XML comments plus Markdown; publish it to GitHub Pages or Azure Static Web Apps from the pipeline.
Automating documentation from Git history
Automated changelogs depend on machine-readable commit messages. The Conventional Commits convention is the standard the tooling assumes.
<type>[optional scope][!]: <description>
[optional body]
[optional footer(s)] # e.g. BREAKING CHANGE: <what changed>
# Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert
# Examples
feat(auth): add SSO via Entra ID → MINOR version bump
fix(api): handle null order id → PATCH version bump
feat(api)!: drop support for v1 endpoints → MAJOR version bump
Caveat — commit type drives the version bump
With semantic-release or standard-version: fix: → patch, feat: → minor, and a ! after the type/scope or a BREAKING CHANGE: footer → major. This is the link between Domain 1 (documentation from history) and Domain 3 (SemVer strategy).
# All commits since the last tag, as a markdown list
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"- %s (%h)"
# Tools that do this properly:
# semantic-release — full release automation (version, tag, notes, publish)
# standard-version — local versioning + CHANGELOG.md
# git-cliff — highly configurable changelog generator (Rust)
# GitHub native — "Generate release notes" from PR titles
Webhooks and service hooks
A webhook is an outbound HTTP POST that the platform sends to your endpoint when an event occurs — push-based, so no polling.
| GitHub webhooks | Azure DevOps service hooks | |
|---|---|---|
| Configured at | Repository, organization or GitHub App level | Project Settings → Service hooks |
| Common events | push, pull_request, issues, workflow_run, release, check_run | Build completed, release created/completed, PR created/updated, work item created/updated, code pushed |
| Payload | JSON (application/json or form-encoded) | JSON, with resource-version selection |
| Security | Secret → HMAC signature in X-Hub-Signature-256; verify before trusting | Basic auth headers / HTTPS endpoint; restrict by filters |
| Built-in targets | — (raw HTTP only; Apps for richer integrations) | Teams, Slack, Jenkins, Trello, Azure Service Bus, generic webhook, and more |
Caveat — always verify the signature
A webhook endpoint is a public URL that anyone can POST to. The correct answer to "how do you ensure the payload really came from GitHub" is configure a secret and validate the X-Hub-Signature-256 HMAC-SHA256 digest — not IP allow-listing alone, and definitely not "use HTTPS".
Integration with Microsoft Teams
| Integration | How | Typical subscriptions |
|---|---|---|
| Azure DevOps → Teams | Install the Azure DevOps app in Teams and sign in, or configure Project Settings → Service hooks → Microsoft Teams | Build/release completed or failed, PR created, work item updated, code pushed |
| Azure Boards → Teams | Azure Boards app for Teams — create and manage work items from the channel | Work item created/updated, plus @azure boards commands |
| GitHub → Teams | Install the GitHub app for Teams, then @github subscribe owner/repo | PRs, issues, commits, releases, deployments, workflow runs |
Signal, not noise
Every integration question that mentions "without overwhelming the team" wants filtered subscriptions — subscribe only to failures, only to a specific branch, or only to a specific pipeline. Blanket subscriptions are always the wrong answer when the scenario complains about notification volume.
Domain 1 rapid recap
| The requirement says… | Answer |
|---|---|
| Link a GitHub commit to an Azure Boards work item | AB#<ID> in the commit message / PR |
| Close the work item automatically when the PR merges | Transition keyword + AB#ID (e.g. fixes AB#42) |
| Guarantee every PR is tied to a requirement | Branch policy: Check for linked work items |
| Auto-assign reviewers by file path | CODEOWNERS |
| Render a process diagram in an Azure DevOps wiki | ::: mermaid block (not triple backticks) |
| Version documentation alongside release branches | Publish code as wiki |
| Report a work-item trend over the last six sprints | Analytics / OData (not WIQL) |
| Find the bottleneck column on the board | Cumulative Flow Diagram — look for the widening band |
| Reduce cycle time quickly | WIP limits (Little's Law) |
| Generate a changelog automatically from commits | Conventional Commits + semantic-release / GitHub generated notes |
| Notify a Teams channel when a pipeline fails | Service hooks → Microsoft Teams, filtered to failures |
| Prove the webhook payload is authentic | Shared secret + verify X-Hub-Signature-256 |