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
{
"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 |
| Linear |
Use Linear MCP to create issues. Map: impact → priority (Urgent/High/Medium/Low), change_type → label. |
Linear MCP |
| 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
- Before modifying any file, config, or system: check if it's a critical asset or connected to one (read
profile.critical_assets).
- If it is: create a change record before proceeding. For critical/high impact, present to user and wait for approval.
- 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.
- Always define a rollback plan. For code changes: the previous commit. For config: the previous value. For infra: document how to revert.
- Log every change via audit-logging, linking to the change_id.
- After implementation, verify the change works and close the record.
- If something goes wrong: execute rollback, document in the change record, consider whether to start an incident record via incident-management.
- Cross-reference with vendor-risk: if the change introduces a new dependency, run vendor assessment first.
1---2name: change-management3description: 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.4---56# Change Control78> Every change to a critical asset gets a record. No exceptions.910## Change record format1112## Storage1314All change records: `.compliance/changes/CHG-YYYY-NNN.json` — one file per change.1516## Change record format1718### Required fields1920```json21{22 "change_id": "CHG-2026-001",23 "status": "proposed | approved | implementing | completed | rolled-back | rejected",24 "requested_at": "ISO 8601",25 "requested_by": "agent | user | system",26 "summary": "One-line description of what changes",27 "affected_assets": ["names from profile.critical_assets if applicable"],28 "impact": "critical | high | medium | low",29 "change_type": "code | config | infrastructure | access | data-schema | dependency",30 "risk_assessment": "What could go wrong",31 "rollback_plan": "How to reverse this change",32 "approval": {33 "required": true,34 "approved_by": "name or null",35 "approved_at": "ISO 8601 or null"36 }37}38```3940### Added after implementation4142| Field | When | Content |43|-------|------|---------|44| `implemented_at` | After execution | ISO 8601 |45| `verified_by` | After testing | Who confirmed it works |46| `closed_at` | After verification | ISO 8601 |47| `actual_impact` | If different from expected | What actually happened |4849## Impact classification5051Impact is determined by which critical assets are affected:5253| Impact | Criteria | Approval |54|--------|----------|----------|55| **Critical** | Touches critical asset with CIA 5 in any dimension | Human approval required before execution |56| **High** | Touches any critical asset, or changes access controls | Human approval required |57| **Medium** | Touches systems connected to critical assets | Agent may proceed with notification |58| **Low** | No critical asset impact | Agent may proceed, log only |5960## Change lifecycle6162### 1. Propose6364Before making a change to a critical asset:6566- Create the change record67- Identify affected critical assets (check `profile.critical_assets`)68- Classify impact69- Define rollback plan — **every change must be reversible**7071### 2. Approve7273- **Critical/High**: present change record to user, wait for explicit approval74- **Medium**: notify user, proceed unless they object75- **Low**: proceed, record for audit trail7677### 3. Implement7879- Log the change via audit-logging (`event_class: "tool_call"`, linked to change_id)80- Execute the change81- Record `implemented_at`8283### 4. Verify8485- Confirm the change works as expected86- Check that no unintended side effects occurred87- Record `verified_by`8889### 5. Close or roll back9091- If successful: close the change record92- If problems: execute rollback plan, log the rollback, document what went wrong9394## What counts as a change to a critical asset9596| Change type | Examples | Impact signal |97|-------------|----------|---------------|98| **Code** | New feature touching critical asset data, DB migration, API endpoint changes | Schema changes = high. New queries = medium |99| **Config** | Firewall rules, conditional access policies, MFA settings, backup config | Security config = critical. Feature flags = low |100| **Infrastructure** | Server migration, cloud region change, scaling changes, DNS | Hosting change = check data residency. Scale = medium |101| **Access** | New user/service account, permission changes, admin role grants | Admin access to critical asset = critical |102| **Data schema** | New columns, table changes, data model modifications | On critical asset DB = high. On non-critical = medium |103| **Dependency** | New library, SDK update, vendor API version change | Check vendor-risk skill for vendor assessment |104105## External ticketing integration106107If 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.108109| Platform | How to integrate | Official skill |110|---|---|---|111| **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) |112| **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) |113| **ServiceNow** | Use ServiceNow Change Management API. Map: `impact` → risk level, CHG record fields align 1:1 with ServiceNow change request schema. | ServiceNow REST API |114| **GitHub Issues** | Use `gh issue create` with labels for impact level and affected assets. Lightweight option for dev teams. | Built-in GitHub CLI |115116When creating external tickets, always also write the local `.compliance/changes/CHG-*.json` record — it feeds into the compliance-hub for retention and audit trail.117118## Agent instructions1191201. Before modifying any file, config, or system: check if it's a critical asset or connected to one (read `profile.critical_assets`).1212. If it is: create a change record before proceeding. For critical/high impact, present to user and wait for approval.1223. 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.1234. Always define a rollback plan. For code changes: the previous commit. For config: the previous value. For infra: document how to revert.1245. Log every change via audit-logging, linking to the change_id.1256. After implementation, verify the change works and close the record.1267. If something goes wrong: execute rollback, document in the change record, consider whether to start an incident record via incident-management.1278. Cross-reference with vendor-risk: if the change introduces a new dependency, run vendor assessment first.