PathixDataverse Forensics
Capability · AI narration

What does this plugin actually do?

Dynamics tells you a plugin is registered. It does not tell you what the plugin does, and the person who wrote it may be three employers away. Pathix reads the compiled assembly and writes back what it does in plain English: the trigger, the branch logic, and the exact columns it writes and reads. Same for classic workflows, cloud flows, and custom APIs.

See it on sample data →How the AI is fenced in →
One narration, in full

Trigger, logic, and every column it touches.

This is a real narration of a plugin, not a summary of one. It names the format string it builds, the thresholds it compares against, and the fallbacks it uses when a value is missing. Underneath, the assembly notes say what the six plugins on that table do to each other, which is the part no single component page can tell you.

AI-derivedWhat this plugin does
Trigger
Create pathix_assetregister PreOperation
Logic

When a new assetregister record of pathix_recordtype 'Asset' is created without an existing pathix_assettag, auto-generates a tag in the format '{locationcode}-{typename3chars}-{sequenceNumber:D3}' by counting existing Asset records at the same location. Also sets pathix_criticality to 'Critical' if pathix_currentvalue >= 100000, 'High' if >= 25000, or 'Standard' otherwise. Falls back to 'LOC' for missing location code and 'GEN' for missing typename.

Writes · 2
  • pathix_assetregister.pathix_assettag
  • pathix_assetregister.pathix_criticality
Reads · 5
  • pathix_assetregister.pathix_recordtype
  • pathix_assetregister.pathix_assettag
  • pathix_assetregister.pathix_locationcode
  • pathix_assetregister.pathix_typename
  • pathix_assetregister.pathix_currentvalue
Assembly notes

All six plugins operate on the pathix_assetregister polymorphic table which stores Locations, AssetTypes, Assets, and SubAssets discriminated by the pathix_recordtype string field. TypeAttributeCopyDown and AssetCodeGenerator both fire on Create/PreOperation for pathix_assetregister and both guard on recordtype='Asset', so they run together on asset creation; ordering between them is not enforced in the sidecar. StatusCascade can recursively touch many records in a single update if a location has many children. All plugins silently swallow exceptions (empty catch blocks) except MegaTableValidator, which intentionally throws to block invalid saves.

About this narration
Model
claude-sonnet-4-6
Generated at
5/29/2026, 2:24:16 PM
Assembly version
3186498
Scanned version
3186498
AI confidence
High
AssetCodeGenerator, one of six plugins registered against a polymorphic asset-register table.
Trigger

The message, table, and stage it registers on.

Logic

What it does, in prose, including the branches and the fallbacks.

Writes and reads

Every column, listed and counted, not summarised.

Assembly notes

What the whole assembly does together: which plugins fire on the same event, where ordering is not enforced, which ones swallow their exceptions.

About this narration

The model that wrote it, the confidence it carried, and the assembly version it read next to the version currently scanned.

Those last two lines matter more than they look. A narration is written once per version of the source and served from cache after that, so the version it read sits next to the version currently scanned. When they diverge, the narration is stale and says so, instead of confidently describing code that has since been replaced.

What gets narrated

four component types, and a reason the list stops there.

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.

Plugin assemblies
Decompiled IL, walked instruction by instruction

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.

Classic workflows
The workflow XAML

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.

Power Automate flows
The flow definition JSON

The trigger and its column filters, every Dataverse action in the run, the expressions that read columns without naming them in a field list, and the child flows it calls.

Custom APIs
Registration metadata plus the implementing assembly

What the operation actually does behind its contract, its request and response parameters, and the columns the implementation touches on the way through.

The compiled half

An inventory that skips your plugins covers the easy half.

Most of the logic worth documenting in a mature environment was compiled years ago. The registration metadata tells you a plugin fires on Update of account; it cannot tell you that it writes three other columns on a related record first. So Pathix decompiles the assembly, walks the IL, and narrates what it finds there.

This is opt-in and off by default. You confirm decompilation is permitted for your environment, you exclude any publisher you do not want read, and the raw bytes are discarded once the parse is done. Only the structural rows and the narration are kept. Set it up so it covers the code your organisation owns and the vendor code your agreements let you inspect, and leave the rest excluded.

The full read and retention picture, including what never leaves the wrapper boundary, is on Your data and Privacy.

JavaScript and web resources

Form scripts get edges, not narration.

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 Parsed, on the same footing as anything read from XAML or flow JSON.

Form scripts

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.

HTML web resources

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 Declared or Parsed 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.

Pathix bidirectional view of account.creditlimit, filtered by confidence. The tier legend reads Declared, pinned by platform structure; Parsed, exact field resolved from the logic; AI-derived, AI's reading of decompiled IL or source. Four writers include three deterministic rows and one AI-derived plugin step, ContosoLegacy.Sync.AccountBalanceShadow. Among the nine dependents, a form script resolves as Parsed. The detail pane for the AI-derived edge offers Review AI Evidence and View AI Narration.

How the tiers work, and what an unresolved edge means, is on dependency analysis.

The leash

Optional, on your key, never the source of truth.

Your provider, your key

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.

Turn it off and nothing breaks

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.

Review is a separate axis

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 →

Where it lands

Narration is an input, not a deliverable.

On its own it documents a component. Where it earns its keep is everything downstream that reads it.

See a narration on a plugin you did not write.

The demo runs the real console on sample data, so you can read a narration end to end before anyone touches your environment.

Open the live demo →Book a walkthrough
© 2026 Pathix · self-hosted · metadata-onlyNot affiliated with Microsoft. Dynamics 365, Dataverse, and Power Platform are trademarks of Microsoft Corporation.