Rename an account, and sometimes its credit limit resets to exactly fifty thousand. The registration tells you when a plugin fires, not what it does, and the source for this one left with Dave.
It reads your own compiled code. The step fires after an account is updated, in the background, only when the account's name changes, and it writes one column: credit limit. That part is deterministic, from the registration and from the code itself.
The narration says the plugin sets credit limit to a fixed fifty thousand, but only when something upstream sets a flag, and nothing in this assembly sets it. That's your "sometimes." Narration is optional and off by default, and it runs on your own key, for the publishers you choose.
The narration says the second update runs inside the same transaction, but the registration says the step is asynchronous, so it doesn't. That mistake is the narration's own, not staged. Pathix says so on every narration: treat it as a lead, not as proof.
One Pathix call returns the registration, and the narration, labeled AI-derived. With the Dataverse MCP alone, the assembly comes back as base64, and your agent would have to decompile it first.
A read-only metadata scan of your environment that reads the logic inside the components: compiled plugins, flow definitions, workflow XAML and scripts.
How it works →The detail behind the answer, for the reader who needs it.
These are the surfaces where the source is large, thrown away after parsing, and hard for a structural parser to read completely. That combination is the whole test. A surface earns narration only when it passes all three, which is why the list is short and stays short.
The trigger it registers on, the branch logic in plain English, the exact columns it writes and reads, and how it handles its own exceptions.
What starts it, the conditions that gate each step, and which columns each step sets, including the steps that never fire because an earlier condition rules them out.
The trigger and its column filters, every Dataverse action in the run, the expressions that read columns without naming them in a column list, and the child flows it calls.
What the operation actually does behind its contract, its request and response parameters, and the columns the implementation touches on the way through.
Script is the one place where the deterministic parser already gives the better answer, so narrating it would spend tokens to say something less precise. Pathix parses it properly instead, and those edges come out as Deterministic, on the same footing as anything read from XAML or flow JSON.
An Esprima AST walk with a dataflow tier: setValue and getValue calls, Xrm.WebApi calls, FetchXML string literals, four handle-shape variants, and conditional detection by brace depth.
Embedded JavaScript is extracted and put through the same walk, plus a recognizer for jQuery AJAX calls against the Dataverse endpoints.
What AI does contribute on these surfaces is the second half of its job: candidate edges. Where the deterministic walk cannot prove a write, an optional sweep can propose one as AI-derived, attached to the evidence it read. Those edges are net-new and additive only. AI never produces a Deterministic edge, never overrides or alters a deterministic one, and never emits an edge without evidence behind it. In the list below, the form script resolved deterministically; the AI-derived row is a plugin the walker could not prove alone.
How the tiers work, and what an unresolved edge means, is on How it works.
It's off by default. You confirm decompilation is permitted for your environment and exclude any publisher you don't want read. The raw bytes are discarded once the parse is done; only the structural rows and the narration are kept.
Anthropic, OpenAI, or Azure OpenAI, including Azure Government. You bring the key and the calls go out from your own tenant. Pathix does not resell tokens.
With no AI configured at all, the deterministic side is untouched: parsing, the graph, findings, cascade, reports, export, and the MCP all work exactly the same.
A person can validate or dismiss an AI-derived edge. That decision is recorded as an overlay and never rewrites where the edge came from, and it never deletes it.
A narration is written to be checked, which is why the model and its confidence sit at the bottom of every one. Treat it as a strong, sourced first draft of the documentation nobody wrote at the time, and confirm it before you act on it. The whole AI posture →
A 30-minute walkthrough on a pre-scanned demo environment. No access to your tenant, nothing to install.