history Last updated

A change request exists so that someone other than the implementer assesses risk before a production change, and so there is a record afterwards. It becomes bureaucracy when every change gets the same scrutiny — the useful version has clear categories with genuinely different paths.

When to use it

  • Production changes affecting shared services, data, or anything under a regulatory or contractual obligation.
  • Standard, pre-approved changes still need a record — but not a meeting.
  • Emergency changes get retrospective approval, on a defined deadline.

What it must answer

  • What is changing, when, and who is doing it?
  • What is the risk, and what happens if it goes wrong?
  • How do we back it out, and how long does that take?
  • Who approved it, and on what basis?

Template

Change Request CR-<id>

FieldValue
Title
TypeStandard (pre-approved) / Normal / Emergency
RiskLow / Medium / High
Requested by / team
Implementer
Windowstart–end, timezone
Services affected
Customer impactNone / Degraded / Outage — with duration
RelatedRelease notes, runbook, incident

1. Description

What changes, in one paragraph a non-specialist can follow.

2. Justification

Why now, and what happens if we do not.

3. Risk assessment

RiskLikelihoodImpactMitigation

4. Implementation plan

Link the deployment runbook; do not duplicate it.

5. Verification

How we will know it worked.

6. Backout plan

Trigger, procedure, duration, and the point after which backout is not possible.

7. Communications

Who is told, when.

8. Approvals

RoleNameDecisionDateConditions

9. Post-implementation review

Completed as planned? Issues? Actual duration?

  # Change Request CR-<id>

| Field | Value |
|---|---|
| Title | |
| Type | Standard (pre-approved) / Normal / Emergency |
| Risk | Low / Medium / High |
| Requested by / team | |
| Implementer | |
| Window | start–end, timezone |
| Services affected | |
| Customer impact | None / Degraded / Outage — with duration |
| Related | Release notes, runbook, incident |


## 1. Description
What changes, in one paragraph a non-specialist can follow.

## 2. Justification
Why now, and what happens if we do not.

## 3. Risk assessment
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|


## 4. Implementation plan
Link the deployment runbook; do not duplicate it.

## 5. Verification
How we will know it worked.

## 6. Backout plan
Trigger, procedure, duration, and the point after which backout is not possible.

## 7. Communications
Who is told, when.

## 8. Approvals
| Role | Name | Decision | Date | Conditions |
|---|---|---|---|---|


## 9. Post-implementation review
Completed as planned? Issues? Actual duration?
  

Worked example

Change Request CR-2026-0884

FieldValue
TitleDeploy Provisioning API v1.14.0 (bundle version pinning fix)
TypeNormal
RiskMedium
Requested byPlatform Identity
ImplementerJ. Marek
Window2026-11-12 07:00–08:00 UTC
Services affectedAccess Provisioning Service; bulk import unavailable ~10 min
Customer impactDegraded — bulk import paused; no impact on individual provisioning
RelatedRelease notes v1.14.0; deployment runbook; DEF-2026-0311

1. Description

Deploys the fix for DEF-2026-0311, where a provisioning request could apply a
different bundle version from the one recorded against it, producing a grant
that cannot be traced to a rule. The change makes that condition an error and
adds an alert. Also adds the re-resolve endpoint and rate-limit headers.

2. Justification

DEF-2026-0311 is a Sev-1 control failure already reported to Internal Audit.
The current mitigation (disabling the bundle clean-up action) is manual and
easily undone by anyone with admin access. Delay keeps an audit finding open.

3. Risk assessment

RiskLikelihoodImpactMitigation
Migration fails mid-deployLowRequests cannot be created until rolled backAdditive nullable column; rehearsed in staging 2026-11-07; snapshot taken at step 4
Old pods reject inserts during the rolling windowLowTransient errors; events queue and retryColumn is nullable in this release; NOT NULL deferred to the next
New error path fires on legitimate requestsMediumRequests fail instead of applying the wrong bundleIntended behaviour — failing safe is preferred. Alert routes to the platform on-call; volume expected to be zero
Window overlaps the HR feed burstLowBacklogWindow is before the 09:00 burst; ingest paused during deploy

4. Implementation plan

See the deployment runbook for v1.14.0. Eight steps, ~25 minutes, point of no
return at step 5.

5. Verification

Health checks on all pods, read-only contract tests against production, one
end-to-end test request for job code TEST-1 reaching COMPLETE with an audit
record, 5xx rate within baseline + 0.1pp over 15 minutes, and the new metric
present and reading zero.

6. Backout plan

Trigger: 5xx above baseline + 1pp for 5 minutes, contract test failure, or any
unexpected PARTIAL request. Procedure: pause ingest, deploy v1.13.4, resume;
approximately 12 minutes. The down-migration is only needed if v1.13.4 fails to
start, since it ignores the new column. Backout remains possible throughout;
after step 5 it requires the down-migration rather than a simple redeploy.

7. Communications

#platform-deploys at start and completion. Service desk lead notified 24h ahead
about the bulk import pause, and directly on any rollback.

8. Approvals

RoleNameDecisionDateConditions
Service ownerA. VogelApproved2026-11-10—
CAB chairD. AchebeApproved2026-11-10Approver present in the window
SecurityA. BergApproved2026-11-10Internal Audit notified when the fix is live

9. Post-implementation review

Completed 2026-11-12 07:52 UTC, 8 minutes ahead of the window. All verification
passed. One deviation: the ingest backlog took 7 minutes to drain rather than
the expected 5, because an overnight HR batch had queued more events than
usual. No impact. CR closed 2026-11-12 11:40 after the 09:00 burst processed
cleanly.

  # Change Request CR-2026-0884

| Field | Value |
|---|---|
| Title | Deploy Provisioning API v1.14.0 (bundle version pinning fix) |
| Type | Normal |
| Risk | Medium |
| Requested by | Platform Identity |
| Implementer | J. Marek |
| Window | 2026-11-12 07:00–08:00 UTC |
| Services affected | Access Provisioning Service; bulk import unavailable ~10 min |
| Customer impact | Degraded — bulk import paused; no impact on individual provisioning |
| Related | Release notes v1.14.0; deployment runbook; DEF-2026-0311 |


## 1. Description
Deploys the fix for DEF-2026-0311, where a provisioning request could apply a
different bundle version from the one recorded against it, producing a grant
that cannot be traced to a rule. The change makes that condition an error and
adds an alert. Also adds the re-resolve endpoint and rate-limit headers.

## 2. Justification
DEF-2026-0311 is a Sev-1 control failure already reported to Internal Audit.
The current mitigation (disabling the bundle clean-up action) is manual and
easily undone by anyone with admin access. Delay keeps an audit finding open.

## 3. Risk assessment
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| Migration fails mid-deploy | Low | Requests cannot be created until rolled back | Additive nullable column; rehearsed in staging 2026-11-07; snapshot taken at step 4 |
| Old pods reject inserts during the rolling window | Low | Transient errors; events queue and retry | Column is nullable in this release; NOT NULL deferred to the next |
| New error path fires on legitimate requests | Medium | Requests fail instead of applying the wrong bundle | Intended behaviour — failing safe is preferred. Alert routes to the platform on-call; volume expected to be zero |
| Window overlaps the HR feed burst | Low | Backlog | Window is before the 09:00 burst; ingest paused during deploy |


## 4. Implementation plan
See the deployment runbook for v1.14.0. Eight steps, ~25 minutes, point of no
return at step 5.

## 5. Verification
Health checks on all pods, read-only contract tests against production, one
end-to-end test request for job code TEST-1 reaching COMPLETE with an audit
record, 5xx rate within baseline + 0.1pp over 15 minutes, and the new metric
present and reading zero.

## 6. Backout plan
Trigger: 5xx above baseline + 1pp for 5 minutes, contract test failure, or any
unexpected PARTIAL request. Procedure: pause ingest, deploy v1.13.4, resume;
approximately 12 minutes. The down-migration is only needed if v1.13.4 fails to
start, since it ignores the new column. Backout remains possible throughout;
after step 5 it requires the down-migration rather than a simple redeploy.

## 7. Communications
#platform-deploys at start and completion. Service desk lead notified 24h ahead
about the bulk import pause, and directly on any rollback.

## 8. Approvals
| Role | Name | Decision | Date | Conditions |
|---|---|---|---|---|
| Service owner | A. Vogel | Approved | 2026-11-10 | — |
| CAB chair | D. Achebe | Approved | 2026-11-10 | Approver present in the window |
| Security | A. Berg | Approved | 2026-11-10 | Internal Audit notified when the fix is live |


## 9. Post-implementation review
Completed 2026-11-12 07:52 UTC, 8 minutes ahead of the window. All verification
passed. One deviation: the ingest backlog took 7 minutes to drain rather than
the expected 5, because an overnight HR batch had queued more events than
usual. No impact. CR closed 2026-11-12 11:40 after the 09:00 burst processed
cleanly.
  

Common mistakes

  • One process for every change. If a config toggle needs the same paperwork as a database migration, people will route around the process entirely.
  • Backout plan as “roll back the deployment”. For anything touching data that is a hypothesis, not a plan. Say what happens to records written under the new version.
  • Approvers who cannot assess the risk. A signature from someone with no basis to judge adds delay and no safety. Pick approvers who can actually say no.
  • No post-implementation review. Without it, the estimates in every future change request stay unexamined.
  • Emergency changes never regularised. Define the retrospective approval deadline, and measure how many changes take the emergency path — a rising number means the normal path is broken.

Last updated 23 Aug 2026, 17:44 -0500. history