Skip to content

Configuration change preview (impact analysis): unified framework and coverage map #827

@JayVDZ

Description

@JayVDZ

Summary

Nearly every configuration change in JIM that alters synchronisation outcomes would benefit from preview (impact analysis) before applying, the same way #288 previews object-level sync and #421 previews schema refresh. Today, preview coverage exists for only a handful of surfaces; this issue maps every sync-affecting configuration surface to its preview coverage, covers the gaps, and proposes a unified framework so we build one preview engine with per-surface adapters rather than N bespoke previews.

Principle: any administrator action that changes which objects project, join, flow attributes, provision, deprovision, or delete should offer an impact analysis before committing, proportionate to its blast radius.

Decision (Jun 2026): framework-first, holistic

Q3 resolved. Change Preview is a holistic solution, not a set of independently-built previews. We design the unified framework (adapter model, tiers, where computation runs, proposed-config representation) first, then implement per-surface adapters in value/severity order. This is a deliberate decision to guarantee a consistent administrator UX and an optimal, single architecture rather than divergent one-off previews.

Consequence (design gate): the per-surface preview issues, #204 (scope changes), #134 (system deletion impact), #421 (schema refresh), and #91's attribute-priority impact-analysis mode, are adapter candidates on this framework. They MUST NOT be implemented independently ahead of the framework design; doing so would produce exactly the UX/architecture divergence this issue exists to prevent. Each is design-gated by this issue.

Why now

The attribute priority design (#91) decided a three-mode configuration change propagation model (apply-only / impact analysis / apply-and-resync). The impact analysis mode is the same capability needed by #204 (scope changes), #134 (system deletion), and #421 (schema refresh). Before building any of them, we design the family once.

Foundation

Coverage Map (Jun 2026)

Sync-affecting configuration surfaces (from a codebase audit), their blast radius, and preview coverage:

Covered by existing issues (to become adapters on this framework)

Configuration surface Sync impact when changed Coverage
Sync rule scoping criteria (groups, comparison type, values, case sensitivity) Objects fall in/out of scope: projection, attribute flow, deprovisioning changes #204
Connected system deletion Attribute recall, precedence shifts, downstream exports, MVO deletion #134, #809 (basic count preview shipped in #135)
Schema refresh (connector-driven object type/attribute removal) Cascade-deletes sync rule mappings, attribute values, potentially objects #421
Attribute priority order / "Null is a value" changes Different contributor wins; values change or clear across affected MVOs #91 (Configuration Change Propagation, mode 2)
Metaverse attribute deletion / mapping removal Orphaned mappings, lost values #465 (validation tier shipped)

Gaps (covered by this issue)

# Configuration surface Sync impact when changed Blast radius / severity
G1 Object matching rule changes (ObjectMatchingRule add/remove/edit, order, case sensitivity), in both simple (per object type) and advanced (per sync rule) modes, including the Simple↔Advanced mode migration Future joins change: CSOs join to different MVOs, or stop joining (affects projection vs join decisions, and everything downstream) Per object type or per rule; high (mis-joins are identity corruption)
G2 Attribute flow mapping changes (add/remove/edit SyncRuleMapping, source attributes, expression edits, chained source order) Different values flow; removed mappings stop contributing (and interact with attribute recall/priority) Per attribute; medium-high. Note: expression syntax validation and single-sample preview exist (#193); the gap is population-level impact ("this expression change alters displayName on 4,200 MVOs")
G3 Sync rule lifecycle and behaviour toggles: Enabled, Direction, ProjectToMetaverse, ProvisionToConnectedSystem, EnforceState, InboundOutOfScopeAction (RemainJoined↔Disconnect), OutboundDeprovisionAction (Disconnect↔Delete); also sync rule creation/deletion Mass effects: disabling a contributing rule stops flow for its population; flipping InboundOutOfScopeAction to Disconnect can mass-obsolete; flipping OutboundDeprovisionAction to Delete turns scope exits into deletions in the target system Per rule; highest severity: the destructive toggles can cascade deletions
G4 Partition / container selection changes (ConnectedSystemPartition.Selected, ConnectedSystemContainer.Selected; also run profile partition targeting) Deselected objects stop being imported, become obsolete, trigger recall/deprovision/deletion cascades Per system; high: a single unticked OU can deprovision thousands of objects (related: #351)
G5 Metaverse object type deletion settings: DeletionRule (Manual / WhenLastConnectorDisconnected / WhenAuthoritativeSourceDisconnected), DeletionGracePeriod, DeletionTriggerConnectedSystemIds Changing the rule or trigger systems can make large numbers of existing MVOs immediately eligible for deletion on the next sync/housekeeping pass Per object type; highest severity
G6 Connected system schema selection and obsoletion settings: object type Selected, attribute Selected, RemoveContributedAttributesOnObsoletion Deselecting stops import/export of types/attributes (orphaning mappings); the recall toggle flips what happens to contributed MVO values on disconnect Per system object type; medium-high

Excluded (no sync-outcome impact, or timing only): MaxExportParallelism, schedules/run profile timing, theming, API keys, certificates, logs.

Proposed Approach

One framework, three tiers, per-surface adapters

Build a single configuration change preview framework rather than bespoke previews per surface. Each surface registers a diff adapter ("given current config and proposed config, compute the affected object set and per-object outcome deltas"); the evaluation reuses the #288 preview engine and SyncOutcome model. Results presented in up to three tiers, matching the established precedents:

  1. Validation (cheap, synchronous): structural consequences; "this mapping references an attribute you are deselecting", "3 sync rules lose mappings" (precedent: Metaverse attribute deletion and mapping removal lack data integrity validation #465, Schema refresh should include a preview phase before applying changes #421)
  2. Count-level impact (moderate, synchronous or short background job): "1,204 CSOs would fall out of scope; 312 MVOs would become eligible for deletion" (precedent: Implement Connected System deletion with preview #135 deletion preview)
  3. Full object-level impact analysis (expensive, optional, background job with sampling strategies): per-object outcome deltas using the preview engine (precedent: Connected System Deletion: Attribute Impact Analysis #134's proposed detailed analysis, Implement Sync Preview Mode (What-If Analysis) #288)

Not every surface needs all tiers; severity drives the minimum. The destructive surfaces (G3 destructive toggles, G4, G5) should not ship preview-less: at minimum tier 2 with a confirmation that states the counts.

Suggested delivery order (severity-first)

  1. Framework design + Implement Sync Preview Mode (What-If Analysis) #288 engine (prerequisite for tier 3 everywhere)
  2. G5 (deletion settings) and G3's destructive toggles (OutboundDeprovisionAction, InboundOutOfScopeAction): tier 2 minimum; these are the "thousands of objects deleted by one dropdown" risks
  3. G4 (partition/container deselection): tier 2 (count of objects leaving scope)
  4. G1 (matching rules) and G2 (attribute flow/expressions): tier 3 is where the value is
  5. G6 and remaining G3 toggles

Split per-surface implementation issues out of this one once the framework design is agreed.

Consistent apply-time messaging (interim, before previews exist)

Until a surface has its preview, apply the #91 "apply-only" pattern everywhere: save-time acknowledgement of consequences, recommendation to run a full synchronisation, and a "configuration changed since last full synchronisation" indicator. This is cheap and uniform, and it is the fallback UX for surfaces whose preview tier is not yet built.

Open Questions

  1. Where does preview computation run? Worker background job for tiers 2-3 (matching the Connected System Deletion: Attribute Impact Analysis #134 mitigation strategies: optional trigger, sampling, top-N attribute summaries)?
  2. How is "proposed configuration" represented for preview-before-save? Unsaved DTO passed to the preview API (as Sync rule scope management enhancements #204 envisages for scoping) vs saved-but-inactive draft config?
  3. Does the framework subsume the per-surface issues as adapters, or do those land first and converge later? DECIDED (Jun 2026): framework-first, holistic. Design the unified framework, then implement Sync rule scope management enhancements #204 / Connected System Deletion: Attribute Impact Analysis #134 / Schema refresh should include a preview phase before applying changes #421 / Implement MV attribute priority #91-mode-2 and the G1-G6 gaps as adapters on it, in value/severity order. Per-surface previews must not be built independently ahead of the framework. See "Decision" above.
  4. Retention: are preview results transient or persisted as Activities for audit ("admin previewed and applied anyway")?

Acceptance Criteria (pre-design)

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    designSomething needs designing/thinking aboutenhancementNew feature or request
    No fields configured for Feature.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions