# Change Management

> ACTIVATE when making changes that affect critical assets: deployments, database migrations, schema changes, Terraform/IaC modifications, access control or IAM changes, firewall rules, TLS certificates, environment variables on production, or dependency upgrades. Ensures every change is documented, impact-assessed, approved, and reversible per NIS2 Art. 21(2)(e) and ISO 27001 A.8.32.

- Skill: `eyesecurity/change-management` (Agent Skill)
- Install (CLI): `npx skillmds@latest add eyesecurity/change-management`
- Raw SKILL.md: https://api.skillmd.com/api/skills/eyesecurity/change-management/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: eyesecurity (https://skillmd.com/u/eyesecurity)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/eyesecurity/change-management

---


# Change Control

> Every change to a critical asset gets a record. No exceptions.

## Change record format

## Storage

All change records: `.compliance/changes/CHG-YYYY-NNN.json` — one file per change.

## Change record format

### Required fields

```json
{
  "change_id": "CHG-2026-001",
  "status": "proposed | approved | implementing | completed | rolled-back | rejected",
  "requested_at": "ISO 8601",
  "requested_by": "agent | user | system",
  "summary": "One-line description of what changes",
  "affected_assets": ["names from profile.critical_assets if applicable"],
  "impact": "critical | high | medium | low",
  "change_type": "code | config | infrastructure | access | data-schema | dependency",
  "risk_assessment": "What could go wrong",
  "rollback_plan": "How to reverse this change",
  "approval": {
    "required": true,
    "approved_by": "name or null",
    "approved_at": "ISO 8601 or null"
  }
}
```

### Added after implementation

| Field | When | Content |
|-------|------|---------|
| `implemented_at` | After execution | ISO 8601 |
| `verified_by` | After testing | Who confirmed it works |
| `closed_at` | After verification | ISO 8601 |
| `actual_impact` | If different from expected | What actually happened |

## Impact classification

Impact is determined by which critical assets are affected:

| Impact | Criteria | Approval |
|--------|----------|----------|
| **Critical** | Touches critical asset with CIA 5 in any dimension | Human approval required before execution |
| **High** | Touches any critical asset, or changes access controls | Human approval required |
| **Medium** | Touches systems connected to critical assets | Agent may proceed with notification |
| **Low** | No critical asset impact | Agent may proceed, log only |

## Change lifecycle

### 1. Propose

Before making a change to a critical asset:

- Create the change record
- Identify affected critical assets (check `profile.critical_assets`)
- Classify impact
- Define rollback plan — **every change must be reversible**

### 2. Approve

- **Critical/High**: present change record to user, wait for explicit approval
- **Medium**: notify user, proceed unless they object
- **Low**: proceed, record for audit trail

### 3. Implement

- Log the change via audit-logging (`event_class: "tool_call"`, linked to change_id)
- Execute the change
- Record `implemented_at`

### 4. Verify

- Confirm the change works as expected
- Check that no unintended side effects occurred
- Record `verified_by`

### 5. Close or roll back

- If successful: close the change record
- If problems: execute rollback plan, log the rollback, document what went wrong

## What counts as a change to a critical asset

| Change type | Examples | Impact signal |
|-------------|----------|---------------|
| **Code** | New feature touching critical asset data, DB migration, API endpoint changes | Schema changes = high. New queries = medium |
| **Config** | Firewall rules, conditional access policies, MFA settings, backup config | Security config = critical. Feature flags = low |
| **Infrastructure** | Server migration, cloud region change, scaling changes, DNS | Hosting change = check data residency. Scale = medium |
| **Access** | New user/service account, permission changes, admin role grants | Admin access to critical asset = critical |
| **Data schema** | New columns, table changes, data model modifications | On critical asset DB = high. On non-critical = medium |
| **Dependency** | New library, SDK update, vendor API version change | Check vendor-risk skill for vendor assessment |

## External ticketing integration

If the organisation uses a ticketing system, create change tickets there instead of (or in addition to) local JSON files. The local `.compliance/changes/` path is the fallback when no external system is available.

| Platform | How to integrate | Official skill |
|---|---|---|
| **Jira** | Use Jira MCP or REST API to create issues in the compliance project. Map: `change_id` → Jira key, `impact` → priority, `status` → workflow state, `affected_assets` → labels. | [Jira MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/atlassian) |
| **Linear** | Use Linear MCP to create issues. Map: `impact` → priority (Urgent/High/Medium/Low), `change_type` → label. | [Linear MCP](https://github.com/modelcontextprotocol/servers/tree/main/src/linear) |
| **ServiceNow** | Use ServiceNow Change Management API. Map: `impact` → risk level, CHG record fields align 1:1 with ServiceNow change request schema. | ServiceNow REST API |
| **GitHub Issues** | Use `gh issue create` with labels for impact level and affected assets. Lightweight option for dev teams. | Built-in GitHub CLI |

When creating external tickets, always also write the local `.compliance/changes/CHG-*.json` record — it feeds into the compliance-hub for retention and audit trail.

## Agent instructions

1. Before modifying any file, config, or system: check if it's a critical asset or connected to one (read `profile.critical_assets`).
2. If it is: create a change record before proceeding. For critical/high impact, present to user and wait for approval.
3. If a ticketing system (Jira, Linear, ServiceNow) is available in the environment, create the ticket there AND write the local JSON record. If no external system: local record only.
4. Always define a rollback plan. For code changes: the previous commit. For config: the previous value. For infra: document how to revert.
5. Log every change via audit-logging, linking to the change_id.
6. After implementation, verify the change works and close the record.
7. If something goes wrong: execute rollback, document in the change record, consider whether to start an incident record via incident-management.
8. Cross-reference with vendor-risk: if the change introduces a new dependency, run vendor assessment first.

