Exception Governance Migration Guide

Audience: operators and platform engineers cutting a tenant over from legacy suppression/notification rules to unified Exception Governance.

Imposed rule: all exceptions must be time-bound, tenant-scoped, and auditable; legacy perpetual suppressions are prohibited after cutover.

This guide explains how to migrate from legacy suppressions and notifications to the unified Exception Governance model in Excititor and the Stella Ops Console. Follow the phases in order — each one is reversible until you decommission the legacy paths in phase 5.

1. What changes

2. Migration phases

  1. Inventory legacy suppressions
    • Export current suppressions and notification rules (per tenant) to NDJSON.
    • Classify by scope: package, image, repo, tenant-wide.
  2. Normalize and enrich
    • Map each suppression to the unified schema; add expiration (default 30/90 days), owner, justification (use VEX schema categories when available).
    • Attach evidence references (ticket URL, VEX claim ID, scan report digest) where missing.
  3. Create staged exceptions
    • Import NDJSON via Console or stella exceptions import --stage (CLI guide: docs/modules/cli/guides/exceptions.md).
    • Run policy simulator; resolve conflicts flagged by Aggregation-Only Contract (AOC) enforcement.
  4. Activate with guardrails
    • Promote staged → active in batches; each promotion emits Timeline events and optional Rekor-backed attestation bundle (if Attestor is enabled).
    • Configure Notify templates for expiring exceptions (T‑14/T‑3 days) and denied promotions.
  5. Decommission legacy paths
    • Disable legacy suppression writes; keep read-only for 30 days with banner noting deprecation.
    • Remove legacy notification hooks after confirming staged/active parity.

3. Data shapes

Import NDJSON record (minimal):

{ "tenant": "...", "vuln": "CVE-...", "scope": { "type": "purl|image|component", "value": "..." }, "justification": "...", "expiration": "...", "owner": "..." }

Export manifest:

{ "generated_at": "...", "tenant": "...", "count": 0, "sha256": "...", "aoc_enforced": true, "source": "migration-legacy-suppressions" }

Attestation (optional): DSSE over the exception-set digest, stored alongside the manifest in Evidence Locker.

4. Rollback plan

5. Air-gap considerations

6. Checklists

7. References