ea-change-management
Logic: AI + AI Power Tools checks. Mostly deterministic operations; the AI judges scope and when to offer a baseline.
What it is for
Use it to make a bulk or destructive change reversible, see exactly what a change did, and answer who changed what, and when. You end with a baseline taken before the change, and a comparison afterward that lists what was added, removed and changed.
ea-change-management governs EA's own baseline mechanism and the repository's change history. A baseline is a snapshot of one package's subtree, stored inside the repository. The skill teaches when to take one (and of what), how to read a comparison against it, why restoring from one is the most destructive operation in the set and how to protect against that, when the AI should offer a baseline before a risky change, how to review and prune the baselines that accumulate, and how to answer "what changed, when, and by whom" from the audit trail.
It is the safety net for the rest of AI Power Tools. Deletes through COM cannot be undone, so the skills that delete, bulk-edit, import or roll out a technology point here first.
Capabilities it uses
| Capability | Used for | Without it |
|---|---|---|
| MCP server | Creating, listing, comparing and applying baselines, the audit trail, and the counts and queries that confirm each step | Not available |
| Computer use | Reading a blocking dialog when a baseline or size query stalls. EA's comparison view, which compare_baseline opens. The manual restore route in EA's interface when apply_baseline reports that nothing changed |
The AI says so and asks you to look, or hands you the manual restore steps. For a blocking dialog, you paste a screenshot of it into the conversation so the AI can read it, then dismiss it. It does not report a hang it has not diagnosed |
| Local code execution | Not used | Not needed |
| Browser control | Not used | Not needed |
When to use it, and when not
Use it before a bulk edit, an XMI import, a package delete, a ruleset-driven fix or an MDG rollout that you might need to undo. Use it to find what changed in a package or the repository over a time window and who changed it, to compare the current state with a known-good snapshot, to roll a package back, and to review or prune old baselines.
| The task | Use instead |
|---|---|
Source-controlled model files (.xml or .eaxmi exports under version control) |
A different workflow. This skill covers EA's own baselines inside the repository |
| A baseline used to rename and lock a protected package root before an MDG rebuild | ea-mdg-model-build. Same EA feature, different purpose |
| Copy a package as a new package | duplicate_package through ea-modeling, and Copy a package as new |
| Find decay or delete safely | ea-model-hygiene |
| Export or import a package as XMI | ea-import-export |
The AI runs the ea-start-here session preflight first. A baseline captured against, or applied to, the wrong model is a wasted afternoon at best.
How it works
- Decide the baseline scope. AI A baseline always covers the whole subtree under the package given. There is no partial-subtree baseline. The AI picks the narrowest package that contains the change being protected against, and reserves whole-model baselines for whole-model operations.
- Create the baseline. AI Power Tools
create_baselinewith a package, a version label and notes. - Confirm it. AI Power Tools
list_baselinesfor the package. - Make the change. (another skill, or you)
- Compare. (AI Power Tools for the comparison, AI for reading it)
compare_baseline, which is read-only. - Keep or revert. (AI recommends, you decide) Reverting is
apply_baseline, behind the precautions below. - Answer "what changed and who changed it". (AI Power Tools reads, AI synthesizes)
get_updates_in_rangeandget_user_activity. - Offer a baseline before a significant change. (AI, you) See "Offer once, honor a no".
- Review and clean up accumulated baselines. (AI + AI Power Tools, you) List with sizes, name exactly what would go, delete only on your explicit yes, verify by re-listing.
Baseline strategy.
| Situation | Scope |
|---|---|
| A repository-wide MDG Technology upgrade, a bulk import, or a model-wide cleanup | The model root package |
| Restructuring or bulk-editing one domain (a single business-area package) | That package only. It is faster to create and to compare, and the difference stays readable |
| A periodic audit snapshot | The model root, on a cadence, so get_updates_in_range between two baselines tells the whole story |
| Handing a package to another team or tool to edit | That package, immediately before the handoff, so there is a clean "before" to compare against |
| Trying out an MDG Technology or ruleset change | A dedicated scratch package, never a real content package |
A package-level comparison against a 20-element package is something a person can read. A comparison against the whole model is not. Every baseline adds a compressed copy to the repository, so baselining large subtrees often grows it. The AI checks the cost with a size query before making it a habit. A local .qea file is a SQLite database underneath, so a query against one must use a function SQLite has; a server connection uses the database's own functions. A query EA's backend cannot run raises a blocking dialog in EA.
create_baseline returns the baseline's GUID, the package's GUID, the version, the notes, a creation time and a status of created. It reports create_baseline_failed when EA reports failure and a structured package_not_found for an unknown package. Keep the baseline GUID. The version string is yours to choose, and a dated, purposeful name (2026-09-24-pre-lifecycle-update) is what makes the cleanup pass later possible.
list_baselines returns each baseline's GUID, version, notes, date, author and name for one package. In some EA builds the date and author come back empty, so do not build logic on them. For authoritative baseline metadata the AI queries the repository directly.
Reading a compare_baseline result. compare_baseline is read-only. It does not touch model content, so it is safe to run at any time, including against a package you do not own, to answer "has anything changed since this snapshot". It also opens EA's comparison view.
The result gives the baseline's own details; the current scope (live element, attribute and connector counts for the package subtree as it stands now); the size of the snapshot (a size proxy and not a comparison); whether a structured comparison was available; and the comparison itself: whether there are changes, a count of items by status, the items, and the packages compared. Each item and each of its properties carries one of four statuses, which are EA's own buckets:
| Status | Meaning |
|---|---|
| Model only | In the model, not in the baseline. Added since the snapshot |
| Baseline only | In the baseline, not in the model. Deleted since the snapshot |
| Changed | In both, with differing property values |
| Identical | In both and the same |
A changed item lists each property with the model value and the baseline value side by side, so a criticality flip from Business-Critical to Standard is told apart from a typo fix in notes by reading the two values, and not just that the element changed. A property absent from one side is shown as none there. Identical items are counted but withheld from the item list by default, because they are the bulk of a real result. Ask for them to get the whole document. The total item count always reflects the unfiltered total, so it can exceed the number of items listed. EA omits unchanged child elements from the comparison, so "Identical" covers the compared package's own item and the unchanged properties of items that did change. A comparison that cannot run returns compare_failed.
The two GUID forms in the result are not interchangeable. Items carry the braced form ({C0CA1B4C-...}) that element lookups take. The compared-package entries carry EA's underscore form. Passing one where the other is expected matches nothing and reports no error.
If compare_baseline appears to hang, the AI looks at EA's screen. AI with computer use; otherwise you With computer use the AI reads the dialog, uses its message to correct the call and dismisses it. Without computer use, you paste a screenshot of the dialog into the conversation so the AI can analyze it, then you dismiss it so processing can continue. EA reports an unrunnable query as a modal dialog that holds the connection until someone clicks OK, so every later call also appears to hang. See Shared references.
apply_baseline is destructive. It overwrites the current content of the package with the baseline's snapshot. The response always carries a warning to that effect. Every element, connector, diagram and tagged-value change in that package since the baseline was taken is discarded, including other people's work. It is not a merge and not a selective revert. It replaces the subtree wholesale.
The AI never calls it against a package it did not baseline for this purpose. On a shared repository a package-level apply can silently erase a colleague's concurrent edits, with no separate confirmation step. Before the call:
- Take a fresh baseline of the current state first, even when sure about the revert. It is the undo for the undo.
- Re-confirm the package and the baseline with
list_baselinesandget_repository_infoimmediately before the call. Applying the right snapshot to the wrong package, or the reverse, is the expensive mistake. - Coordinate with anyone else working in that package. Reads are safe anytime. This write is not.
- After the call, verify explicitly. Query the package's contents (
execute_sqlorlist_elements_in_package) and do not trust the response alone, in either direction.
How the operation behaves: it first runs a comparison. If EA cannot return one it reports compare_unavailable. If the package already matches the baseline it reports already_matches_baseline and does nothing. Otherwise it restores with a full-restore merge instruction, then compares again and reports success only when EA confirms no differences remain: a status of applied, with restored true. If differences remain it reports baseline_restore_not_applied and says nothing was changed, and its message points to the manual route in EA's interface (right-click the package, Package Control, Baselines, select the baseline, Restore). Taking that route is AI with computer use; otherwise you and needs the same precautions. Treat baseline_restore_not_applied as "nothing changed", not a partial success. A merge that raises reports apply_failed, and a comparison that raises reports compare_failed. Each carries the warning. Because the operation restores for real and verifies, it is also more dangerous than a simple snapshot.
Audit trail: what changed, when, by whom. Two read-only, repository-wide operations answer complementary questions.
get_updates_in_range returns one row per changed item: its kind, identifier, name, type, package and modification time. kind accepts elements (the default, which includes packages alongside ordinary elements), packages, diagrams and all. Connector-level history is not tracked, so connectors is not a valid kind. The operation shows that something changed and when, not what changed about it. For field-level differences, compare against a baseline or read the element.
get_user_activity returns one row per author: how many elements and diagrams they modified and when they were last active. The author is the EA or Windows login recorded on the item as the last editor, not a chosen display name. Present the counts as the authors of the items modified in the window. Fine to read inside your own repository for audit, but do not copy it verbatim into shared tickets, documentation or examples.
Neither operation takes a package. Both are repository-wide. For a package-scoped question, filter the rows by package afterward, or ask for a query on that package. The two combine: get_user_activity says whom to ask about a window of change, get_updates_in_range says what they touched, and compare_baseline against a snapshot from before that window says exactly what changed on each item.
Dates can be given as YYYY-MM-DD, YYYY-MM-DD HH:MM:SS, or ISO-8601 with a T separator and a Z or offset suffix. They are normalized to the form EA stores, and a bare end date covers the whole day. An unparseable date returns invalid_date_range.
Offer once, honor a no. A baseline is a rollback point only if it is taken before the change. No operation asks the user anything, so offering is a conversational decision the AI makes. It follows the same ask-once pattern as ea-navigation-diagrams. Offering on every write is worse than offering on none, because it bloats the repository and trains people to click through.
| Trigger | Operation | Threshold |
|---|---|---|
| Package deletion | delete_package |
Always. No size is too small to protect a whole subtree |
| Bulk edit | create_elements_bulk, create_connectors_bulk, add_elements_to_diagram_bulk, or a scripted loop of update_element, delete_element or set_tagged_value |
More than 25 elements or connectors touched, counting the whole logical operation. Forty individual update_element calls are still a 40-element change |
| Ruleset-driven fix | Corrective writes applied after ea_validate audit reports non-conformant elements |
More than 25 elements affected. The audit call is read-only and does not trigger the offer. Acting on its findings does |
| MDG rollout | install_mdg into a repository that already holds content the technology governs, followed by bringing it into conformance |
Always. The point of a rollout is reclassifying existing elements |
| XMI import | import_xmi |
Always, whatever the file size. The operation changes the target package in place and is semi-destructive |
The line of 25 elements is a stated judgment: below it, a mistake can be hand-fixed by re-running a few calls, above it reconstruction is real work. A deployment can adjust it and should state the number it uses.
How the offer works:
- The AI asks before the triggering call, stating the operation, its scope, roughly how many elements it affects, and which package or the model root would be baselined. You
- Accepting creates the baseline (the package being changed, or the model root for a repository-wide operation), confirms it with
list_baselines, then proceeds. - Declining is remembered for the rest of the session, per trigger category. A "no" to one
delete_packagestops furtherdelete_packageoffers, but a separate bulk edit or ruleset fix still gets its own first ask. A standing preference ("stop offering to baseline") covers every category for the session. A new session starts clean. - Two options every time: yes, baseline first, or no, proceed without one.
delete_packagereports nothing about what it removed, so the AI pulls the count first withlist_package_treeand element counts. That also makes the offer concrete: "About to delete theLegacy Integrationspackage (14 elements, 3 diagrams). Want me to baseline it first?"
Reviewing and cleaning up baselines. Baselines accumulate, and nothing prunes them. The AI helps you see what is there and remove what is no longer needed.
- List, with the cost. AI Power Tools
list_baselinestakes a single package and not a repository-wide sweep. To review a whole model, the AI collects packages withlist_root_packagesandlist_package_tree, then callslist_baselinesonce per package. Payload size is the number that answers "which can I delete", so the AI adds it with a direct query. It joins the two result sets, converts bytes to KB or MB, and presents one table sorted by size, with version, notes and size. - Ask, naming exactly what goes. (AI, you) Version, notes and size, not just a GUID. You can confirm several at once ("delete the three oldest"), but only after seeing all three named individually. The AI never deletes more than what was shown and agreed, and never defaults to "clean up everything older than X" without that per-item listing.
- Delete only what was confirmed. AI Power Tools A baseline is removed with a direct database delete. That is a write with no undo of its own.
- Verify by re-listing. AI Power Tools Re-run
list_baselinesand confirm the deleted entries are gone. A reported write means the statement ran, not that the row removed was the row intended.
What you get
- A baseline you can find again: a dated, purposeful version label and a confirmed entry.
- A readable comparison: items added, deleted and changed, with old and new values side by side.
- A guarded rollback, with a fresh safety baseline taken first and the result read back.
- An answer to "what changed, when, and by whom", and an offer of a baseline before significant changes.
- A reviewed list of baselines with sizes, and removal of only the ones you confirmed.
Tools it relies on
create_baseline,list_baselines,compare_baseline,apply_baseline(Baselines): snapshot, list, compare, restore.create_baselineandapply_baselinewrite.get_repository_info(Project): confirm the right repository before a baseline or an apply.import_xmi(Import and export),install_mdg(Managing technologies) andaudit(ea_validate): the operations whose use triggers an offer. This skill's own steps do not call them.get_updates_in_rangeandget_user_activity(Audit trail): repository-wide change history by time window and by author.execute_sql(Direct queries): baseline size, baseline deletion, package-scoped filtering.list_package_tree,list_root_packages,list_elements_in_package,delete_package(Packages, Elements): scope sizing before the offer, whole-model review, post-apply verification.- Shared references: EA UI verification and latency (ea-ui-verification.md, latency.md).
Sample prompts
- "Take a baseline of the Westbrook Consumer Banking package called pre-restructure, with a note that it's before we split the vendor-system subtree." Creates the baseline, then lists to confirm.
- "What changed in Consumer Banking since that baseline?" Compares, then summarizes added, deleted and changed items with old and new values.
- "I'm about to retag 38 elements' lifecycle in Consumer Banking. Anything I should do first?" Offers a baseline because the count is above 25, naming the scope, and creates it on yes.
- "Who was editing the model on 23 September, and what did they touch?" Reads user activity and updates for that day, filtered to a package if asked, with a reminder not to paste raw logins into shared documents.
- "Roll Consumer Banking back to the pre-restructure baseline." Takes a fresh baseline of the current state first, re-confirms package and baseline, asks about concurrent editors, applies, then reads the package back.
- "How much space are our baselines taking, and what can we delete?" Lists baselines per package with sizes, proposes the largest stale ones by name, deletes only the ones you confirm, and re-lists.
Recommended models
| Model | Fit | Why |
|---|---|---|
| Claude Fable 5.1 | Recommended | Best at holding the safeguards under pressure (fresh baseline before an apply, per-item delete confirmation) and at explaining a comparison plainly |
| Claude Opus 5.5 | Recommended | Same. Good for a cleanup pass across many packages |
| Claude Sonnet 5.5 | Recommended | The operations are deterministic and the procedure is fixed. A good default, with apply_baseline always confirmed in chat |
| Claude Haiku 4.5 | Capable | Fine for create, list and compare. Check that it takes the fresh baseline before an apply and does not batch-delete baselines |
Ratings are guidance based on the kind of reasoning the skill needs, not measured benchmarks.
Checking accuracy and completeness
- The baseline exists and is the right one. After
create_baseline,list_baselinesfor the same package shows the new version and notes, and the GUID from the create matches a listed entry. Complete: ask for a direct size query of the stored baselines as a cross-check. - The comparison matches a known change. Make a controlled change (add one element, edit one tag), compare, and confirm one "Model only" and one "Changed" item, and that the changed property lists the old and new values. Red flag: no structured comparison available, or a parse error.
- Scope check. The current element counts in the result match
list_elements_in_package(recursive) for the same package. Red flag: a mismatch, which means the comparison targeted something other than intended. - Restore fidelity. After
apply_baseline, the response says restored, and independently a secondcompare_baselinereports no changes, element counts equal the baseline's counts, and a name-level query matches.baseline_restore_not_appliedandalready_matches_baselineare reported as such. - A safety baseline was taken first. Before every
apply_baseline, the transcript shows acreate_baselineof the current state and alist_baselinesre-confirmation. Red flag: an apply with neither. - Offers follow the table. Over a session, every
delete_package,import_xmiand MDG rollout was preceded by an offer, no offer was made for a small single-element edit, and a declined category was not asked again. - Audit queries agree with a count.
get_updates_in_rangefor a window matches a count of the items modified in that window (plus packages). Red flag: a zero result for a window you know had changes, which is a reason to check the date format. - Cleanup was per item. Each deleted baseline was named with version, notes and size, and confirmed, and
list_baselinesafterward lacks exactly those entries.
Limitations
apply_baselinediscards later work wholesale, including other people's. It is not a merge and not selective, and an undo exists only if a fresh baseline was taken first.- The server cannot enforce the precautions. Baselining first, confirming identifiers and coordinating with colleagues are habits the AI follows. A caller that skips them is not stopped.
list_baselinesdate and author can be empty in some EA builds. Use a direct query for authoritative metadata.get_updates_in_rangeandget_user_activityare repository-wide and take no package filter. Connector history is not supported, and neither operation reports field-level changes.- Baseline size and baseline deletion use a direct database statement. Deletion is a raw write with no undo, and EA's open session can go stale after it.
list_baselinestakes one package. Reviewing a whole model means one call per package.- Baselines grow the repository. The cost is per snapshot and per subtree.
- A hang is usually a modal dialog, not a slow operation. EA raises one for any query its backend cannot run, and it holds the connection until dismissed. Look at the screen before retrying. With computer use the AI reads the dialog, corrects the call and dismisses it. Without it, you take a screenshot of the dialog and paste it into the conversation so the AI can analyze it, then you dismiss the dialog so processing can continue.
- The two GUID forms in a comparison are not interchangeable, and a mismatch fails silently.
- Baselines are not version control. They live inside the repository and travel and fail with it. They do not replace backups.
- Author values are personal identifiers. Treat the user activity output accordingly.
- Windows only, with EA running. The server attaches to a running EA. Starting EA and opening the model is a separate step (ea-start-here).