PathixDataverse Forensics
Capability · Dependency analysis

What writes to this column?

Dynamics cannot answer that about itself. Pathix resolves it across forty component surfaces, covering both what writes the column and what reads it. Every edge carries the evidence behind it, and the writes Pathix could not trace get labeled instead of dropped.

Book a walkthrough →Or do it by hand: the manual method →
The answer

One column, every component that touches it.

Writers and readers appear in one ranked list. Each row shows the component kind, the direction of the edge, and how Pathix established it. You can filter by direction or by confidence, export the table to CSV, and click any row through to that component's own page.

The Pathix touchpoints view for the column account.creditlimit. A header reads 6 writers, 12 readers, 2 conditional, with a salience score of 48 at the 88th percentile within the environment, and chips for fan-in 18, sensitive, near a finding, and unvalidated AI edges. Filters run across direction (all, writes, reads) and confidence (all, declared, parsed, AI-derived). Eighteen rows list each touchpoint: a plugin step writing the column at AI-derived confidence, an orphaned plugin step reading it, a classic workflow both writing and reading, a canvas app, an HTML web resource, two more plugin steps, a business rule, a dashboard, a form, a form script, a cloud flow, a PCF control, a saved query, and a chart, each with its confidence tier. Below, a signals panel shows one medium-severity finding: an orphaned plugin step targeting a deleted entity.

Point your agent at this instead of the console. find_writers and find_readers return the same resolved list with the same confidence on every row, read-only, over the Pathix MCP →

The chain

The form a visitor fills in, and the number an executive reads.

The path runs from a page on your Power Pages site, through the advanced form it embeds, a plugin, a classic workflow, a cloud flow and a formula column: 6 components joined by 10 resolved edges. No screen in Dynamics shows more than one of those links at a time. Pathix resolves the path from the parsed definition of each component.

Read it as structure, not as traffic. Pathix parsed what each component is defined to do. It did not watch a record move.

  1. 01POWER PAGES PAGE
    Book an Appointment form
    /book-an-appointment
    Someone outside your organization opens the page.
  2. 02ADVANCED FORM
    embed tag on the page DETERMINISTIC · DECLARED
    C2 Book an appointment
    six steps, each binding a model-driven form
    They answer six screens and submit.
  3. 03TABLE
    step metadata binds the columns DETERMINISTIC · DECLARED
    msdyn_appointmentrequest
    sim_estimatedvalue, sim_referralsource
    Their answers become a record, including an amount.
  4. 04PLUGIN
    read by the plugin's PostOperation Create step DETERMINISTIC · DECLARED
    AppointmentRequestPostCreate
    new Entity("sim_bankengagement")
    Code fires on save and creates a second record from it.
  5. 05TABLE
    written from IL DETERMINISTIC · PARSED
    sim_bankengagement
    sim_estimatedvalue, sim_producttype, sim_routingtier
    The amount is now on a record nobody filled in.
  6. 06CLASSIC WORKFLOW
    CheckProperty, a filter read DETERMINISTIC · PARSED
    sim_ComplianceReviewTrigger
    CreateEntity, then SetEntityProperty from the read value
    A workflow reads that amount and opens a compliance review.
  7. 07TABLE
    column to column, derived DETERMINISTIC · PARSED
    sim_compliancereview
    sim_exposureamount
    The same number, under a different name, on a different table.
  8. 08CLOUD FLOW
    trigger filters on sim_riskscore, sim_status DETERMINISTIC · PARSED
    sim_BranchRollup
    UpdateRecord, read from the flow's clientdata JSON
    A flow rolls it into the branch's daily totals.
  9. 09TABLE
    item/sim_committedvalue DETERMINISTIC · PARSED
    sim_branchdaysummary
    sim_committedvalue, sim_pendingreviewcount
    It is now part of a committed-value total.
  10. 10FORMULA COLUMN
    read by the formula expression DETERMINISTIC · DECLARED
    sim_capacityutilization
    computed from sim_committedvalue
    A formula turns that total into a utilization percentage.
  11. 11SAVED QUERY + CHART
    charted on the same column DETERMINISTIC · DECLARED
    Charted on sim_capacityutilization
    An executive reads the percentage, and sees none of the above.

The first two nodes are where the other half of this lives. Resolving the page, the form it embeds and the columns those steps bind is one problem; deciding who is allowed to load that page in the first place is a different one, with its own surface: what a visitor who never signs in can reach →

The entry point is Microsoft's out-of-the-box scheduling template. Everything downstream carrying a sim_ prefix is a scenario built to exercise the parsers, not a customer environment.

One hop, in detail

Four calls in one plugin, resolved four separate times.

This is why a single score per component would be useless. Pathix resolves each call on its own terms rather than grading the assembly as a whole: one is pinned by a registration, the rest are read out of the IL, and two are not edges at all but findings in their own right.

CALL
WHAT PATHIX TAKES FROM IT
HOW IT RESOLVED
new Entity("sim_bankengagement")
Creates the downstream record and sets four columns on it, including the one the rest of the chain derives from.
DETERMINISTIC · PARSED
ExecuteWorkflowRequest(guid)
Invokes the classic workflow by a pinned identifier, so the target is exact rather than inferred.
DETERMINISTIC · DECLARED
HttpClient.PostAsync("http://...")
Posts outbound over plaintext HTTP. The destination is a literal, so Pathix resolves it and raises it. See the finding →
DETERMINISTIC · PARSED
catch { }
Swallows the exception, so a failure anywhere above leaves no trace and the chain appears to have succeeded. See the finding →
DETERMINISTIC · PARSED
Not a tree

The chain closes back on where it started.

A plugin four hops down writes msdyn_appointmentrequest.sim_syncstatus back onto the table the chain began from. Drawn as a tree that edge simply disappears, and with it the reason a change made late in the chain can surface at the beginning of it.

TABLEmsdyn_appointmentrequestPLUGINWORKFLOWCLOUD FLOWFORMULAEngagementPreUpdatewrites sim_syncstatusback onto the table the chainstarted from.
Both directions

Reads are dependencies too.

Writers tell you what can change a column. Readers tell you what breaks when it does, and those are different problems. Pathix models both directions and labels the kind of dependency, because a chart that displays a value fails very differently from a flow trigger that branches on it.

KIND
WHAT IT MEANS
EXAMPLE
Write · Direct
The component assigns the column on the target record.
A plugin step setting creditlimit on the account it fired for.
Write · Related table
The component writes the column on a different record it reached.
A workflow updating the parent account from a child case.
Read · Filter
The value decides whether something runs or what it returns.
A flow trigger condition, a FetchXML filter.
Read · Display
The value is shown to somebody.
A form column, a view column, a chart series.
Read · Computation
The value feeds a derived result.
A rollup, a formula column, a canvas app expression.
Read · PreImage
The platform captures the prior value before the change.
A plugin step pre-image registered on update.

Write edges carry two further details. One is conditionality: does the write always fire, or only inside a branch. The other is origin, which separates a person editing a form from an automation running on its own.

Every surface these edges are parsed from →

How Pathix knows

Every edge says where it came from.

If you cannot check how a dependency was found, you are taking the list on faith. Every edge carries one of 3 confidence tiers. Pathix never averages them into a single score, and it shows the weakest tier as plainly as the strongest.

DETERMINISTIC

Either the platform's own structure pinned the target, or Pathix read the component's logic and resolved the exact column from it. Both are certainties rather than estimates, which is why they now read as one tier: the distinction between them is how Pathix knows, not how much it knows, and that belongs on the row rather than in the headline.

AI-DERIVED

An optional AI pass read decompiled code and proposed an edge the parser had missed. It arrives with the evidence that justifies it attached, it is net-new only, and it can never override a deterministic edge. Dismissing one hides it without destroying it.

UNRESOLVED

Pathix found a write and could not trace what it targets, usually because the column name is assembled at runtime. It keeps a tier of its own so the write stays visible instead of being silently dropped, which is the whole reason it is not simply omitted.

Open a deterministic row and it says which of the two ways it was resolved. That is a method, not a grade: both are certainties, and neither outranks the other.

Deterministic · declared

the platform's own structure pinned the target: a step registration, a manifest, a binding, a column mapping.

Deterministic · parsed

Pathix read the component's own logic and resolved the exact column out of it: compiled plugin IL, workflow XAML, a flow's definition JSON, a JavaScript syntax tree, a Power Fx expression.

Pathix reads compiled plugins

A plugin ships as compiled IL, so the platform's own dependency tracking stops at the registration and never sees the column assignment inside. Pathix decompiles the assembly and walks the IL for column-level reads and writes. That covers assemblies shipped by a vendor, which you opt into and can exclude per publisher. Vendor code writes to your columns like anything else, and skipping it would leave a gap in the graph exactly where you have no other way to look.

A distinction that matters

A role that grants write access is not a writer.

Granting the ability to write is not the same as writing. Pathix keeps them on separate surfaces on purpose: write edges live in the dependency graph, and who can write lives with the roles and principals. They never merge into one edge.

Blur the two and a permission starts looking like a dependency, which is the confusion an access review exists to prevent. The dependency graph answers what could change this value. The roles and principals answer who could, and a list that mixes them is not a reliable answer to either one.

Who can write it: effective permissions →The findings that come out of both →
Coverage, honestly

What structural parsing misses, and what closes it.

Any tool that claims to find everything is guessing somewhere. Two gaps are worth naming. Pathix labels both in the product, so a clean-looking list never implies more certainty than it has.

Column names built at runtime

A late-bound or dynamically assembled column name cannot be resolved from structure alone. Pathix marks the write Unresolved and adds it to a worklist rather than guessing at a target. With AI enabled it reads the decompiled or original source and can propose an evidence-coupled edge for some of them, so the gap is smaller than the parser alone would leave it.

PCF controls, at manifest tier

Pathix traces bound properties from the manifest through each form binding. A control that takes its column name from runtime configuration is a documented gap in the coverage register.

Canvas apps are the one place depth is a setting rather than a limit. Standard parsing resolves them as far as the table; switch deep scan on for an environment and Pathix unpacks the app package for column-level attribution.

All of which is why an empty result is worded carefully. A column with no writers means no scanned surface resolved a write to it. Treat that as a strong lead worth checking, well short of a guarantee that nothing can write it.

The manual method

You can do this by hand.

Both guides work whether or not you ever buy anything, including the parts where the manual approach gives out.

Try it on a column you already worry about.

A walkthrough runs the real console on a sample environment. Open a column, filter by confidence, and see what the answer looks like before anyone touches your tenant.

Book a demoRead the sample report →
© 2026 Pathix L.L.C. · self-hosted · metadata-only
Not affiliated with Microsoft. Dynamics 365, Dataverse, and Power Platform are trademarks of Microsoft Corporation.π