Article_ - rpapub/WatchfulAnvil GitHub Wiki
In the realm of software development, acronyms tend to fly faster than keyboard shortcuts. Among them, “SDK” holds a firm place in the glossary of acronyms everyone pretends to understand until asked to explain it aloud. So here’s a useful deep-dive into what an SDK is — in general and in the peculiar, surprisingly powerful case of UiPath’s Workflow Analyzer SDK.
At its core, an SDK — short for Software Development Kit — is a collection of resources bundled together to make life easier for developers building software against a specific platform, product, or framework. Think of it as a thoughtfully packed toolkit rather than a random pile of power tools.
A typical SDK often includes:
- APIs – The official interfaces and types made available to developers (kind of like the storefront window for a product’s internal workings).
- Libraries – Precompiled code packages, usually in DLL or package format, that expose functionality.
- Documentation – Preferably readable and not just written by engineers at 2 AM.
- Sample Code – The “try me” section of the SDK experience.
- Utilities – Build tools, test frameworks, or command-line instruments.
Together, these elements let developers extend, inspect, or integrate with the host platform — and ideally not rage-quit in the process.
Enter the UiPath Workflow Analyzer SDK — a toolkit built specifically for developers crafting custom static analysis rules inside UiPath Studio, the flagship IDE for robotic process automation.
This SDK allows for the creation of rules that analyze different scopes of a UiPath automation project:
Rule Type | Scope |
---|---|
IActivityModel |
Single activities in a workflow |
IWorkflowModel |
Entire .xaml workflow files |
IProjectModel |
The full automation project |
These rules are compiled as .NET assemblies and plugged into Studio’s analyzer engine. Once in place, they enable Studio to apply rule-based validations across workflows and projects — kind of like a linter but with RPA goggles on.
The UiPath Analyzer SDK is composed of several moving parts:
-
Rule infrastructure like
Rule<T>
,IRegisterAnalyzerConfiguration
, andInspectionResult
-
Data models such as
IActivityModel
,IWorkflowModel
, andIProjectModel
, each representing different structural layers of a UiPath solution -
Configuration services (
IAnalyzerConfigurationService
) to wire rules into the analyzer runtime - Deployment hooks that enable rules to be recognized by Studio once copied into the correct directory
For those with a knack for .NET, building a rule is as simple as subclassing a rule type, wiring up a registration class, and shipping the DLL. For those without that knack... coffee helps.
Term | Translation |
---|---|
Library | A reusable code unit to call into |
API | The public interface of what the library exposes |
SDK | The full kit — API, libraries, docs, and probably that one README no one reads |
Put differently, an SDK is what gets shipped when a product wants people to do smart things with it — and would prefer those smart things to work on the first try.
For RPA teams, building custom analyzer rules enables governance, consistency, and compliance — or at the very least, avoiding the phrase “we didn’t know this workflow had 400 variables.”
The Workflow Analyzer SDK makes that possible by letting rules look under the hood — probing activities, inspecting workflow structures, and auditing project-level conventions. And since all this happens at design-time, no robots are harmed in the process.
The UiPath Analyzer SDK exemplifies what a domain-specific SDK can do when thoughtfully assembled. It's not just about extending Studio — it’s about empowering automation developers to enforce standards, catch issues early, and shape better robot logic from the inside out.
Now, if only every SDK came with a built-in coffee dispenser.
.
Here’s Section 2 of the article, continuing from the SDK introduction — now focusing on data model logging and how it supports static rule design:
Once an SDK is understood as a toolkit, the next step is to figure out what can be observed — and logged — when using it to analyze software. In the case of the UiPath Workflow Analyzer SDK, this means examining the data model that each rule receives during execution.
Imagine tapping a metal pipe and listening for its response. That’s what these custom rules do — they tap into activities, workflows, and entire projects to log what’s inside. This isn’t just idle curiosity; it's a diagnostic strategy. The clearer the log, the smarter the future rule.
Each rule type (IActivityModel
, IWorkflowModel
, IProjectModel
) exposes a distinct scope of information:
- Activities expose variables, arguments, properties, and annotations — the atomic building blocks of behavior.
- Workflows present a bundle of arguments, namespace imports, and the root container, giving insight into structure.
- Projects aggregate workflows, dependencies, entry points, and global configuration.
Each data point logged can later evolve into a rule:
Logged Item | Possible Rule It Supports |
---|---|
activity.ToolboxName |
Detect disallowed activity types |
workflow.Arguments |
Validate required input/output contract |
project.Dependencies |
Flag use of deprecated packages |
activity.AnnotationText |
Check for missing documentation or TODOs |
Logs aren't just for debugging — they act as rule prototypes. A line like:
ActivityTap: DisplayName=Click 'Submit', Type=Click, Args=2, Annotation=Confirms form submission
…is more than text. It tells a Solution Designer that:
- The activity has a human-readable role
- It has parameters that may need validation
- It includes (or lacks) helpful annotations
Now that data is visible, rules can be framed. For example: "Every activity in a critical sequence must include an annotation," or "Workflows should expose no more than 5 arguments."
Logging full .NET type names (with namespaces, versions, and public key tokens) can be overwhelming. A smart logging layer simplifies:
System.Collections.Generic.Dictionary`2[[System.String,...],[System.Object,...]]
…to:
Dictionary<String, Object>
This makes rule authorship readable and declarative, not a hunt through reflection spaghetti.
In short, logging the data model is like taking X-rays of automation logic. It reveals not just the bones, but how they connect — and sometimes, how they shouldn't. Up next: how to go from logged structures to understanding how automation flows, forks, and finishes. That’s where structure meets behavior.
.
With Examples from UiPath and Popular Programming Languages
In software development, clean, consistent, and correct code is non-negotiable—whether you're writing Python scripts or designing UiPath automation workflows. Yet the tools developers use to enforce quality are often confused: linters, formatters, and static code analyzers all get mentioned interchangeably.
This article cuts through the noise. We'll define each tool, show how they differ, and demonstrate how they show up in languages like JavaScript, Python, and UiPath.
A static code analyzer inspects source code without executing it. Its focus is deep: logic errors, code smells, anti-patterns, and structural issues.
- 🧠 Looks at control flow, data flow, and architecture
- ✅ Flags bugs, security issues, and design violations
Examples:
- SonarQube (multi-language)
- Roslyn analyzers (.NET)
- UiPath Workflow Analyzer SDK (custom project/workflow rules)
A linter checks code against style rules and best practices. It’s shallower than a static analyzer but still valuable.
- 📏 Focuses on naming, unused variables, simple patterns
- 🚨 Warns about violations; may optionally auto-fix some
Examples:
- ESLint (JavaScript)
- Flake8 (Python)
- Checkstyle (Java)
A formatter automatically reformats code to follow a consistent style.
- 🎨 Focuses on whitespace, indentation, line breaks
- ✨ Often runs automatically on save or in CI pipelines
Examples:
- Prettier (JavaScript)
- Black (Python)
- gofmt (Go)
Feature | Static Analyzer | Linter | Formatter |
---|---|---|---|
Goal | Code correctness | Code style & conventions | Code formatting |
Depth | Deep (logic, structure) | Shallow (syntax, naming) | Surface (layout only) |
Fixes? | Rarely | Sometimes | Always |
Output | Errors, warnings | Warnings, suggestions | Reformatted code |
Use case | Catch bugs & smells | Enforce standards | Beautify code |
-
Analyzer:
Mypy
,Bandit
-
Linter:
Flake8
,PyLint
-
Formatter:
Black
-
Analyzer:
SonarJS
,TypeScript Compiler (tsc)
-
Linter:
ESLint
-
Formatter:
Prettier
-
Analyzer:
SpotBugs
,SonarQube
-
Linter:
Checkstyle
,PMD
-
Formatter:
Google Java Format
-
Analyzer:
Roslyn
,NDepend
-
Linter:
StyleCop
-
Formatter:
dotnet-format
Some tools blur the lines:
- ESLint lints and can auto-fix formatting (e.g., quotes, spacing).
- ktlint (Kotlin) does both linting and formatting.
- RuboCop (Ruby) combines all three roles.
This overlap is useful—but also a source of confusion. When tools do too much, teams must decide which features to rely on, and which to turn off.
UiPath provides full static code analysis using the Workflow Analyzer:
-
Built on top of the Microsoft WF structure (
.xaml
workflows as visual trees) -
Rules can analyze:
- Individual activities (
IActivityModel
) - Entire workflows (
IWorkflowModel
) - The whole project (
IProjectModel
)
- Individual activities (
-
SDK allows writing deep, customized rules tied to design-time structures and metadata
This positions UiPath’s analyzer as closer to architectural static analyzers (like Roslyn or SonarQube), rather than just linters.
UiPath doesn’t separate out “linting,” but custom Workflow Analyzer rules can simulate it:
- Flag naming violations (e.g., variable or argument names)
- Require or check for annotations
- Enforce use of certain activities or patterns
- Block anti-patterns (e.g., nested Try-Catch inside Loops)
These rules can enforce style conventions, though there is no dedicated category or UX for “linting” as in code editors.
UiPath uses a visual workflow designer, not a text-based code editor. That means:
-
There's no auto-alignment or auto-layout of workflow diagrams
-
Workflow visual consistency is manually controlled by the developer
-
Unlike code formatters (like
Prettier
), UiPath offers no way to:- Normalize layout or container positions
- Sort or group activities visually
- Enforce consistent visual spacing, alignment, or flow
This is a significant gap for teams trying to standardize visual presentation of workflows at scale. Design reviews or template patterns are often used as workarounds.
Tool | What it ensures | UiPath Equivalent |
---|---|---|
Analyzer | Code is correct, safe | Workflow Analyzer rules |
Linter | Code follows style rules | Partially via custom rules |
Formatter | Code looks consistent | ❌ Not available in Studio |
In the world of automation, especially with platforms like UiPath, static analysis plays a critical governance role. While traditional linters and formatters aren't fully represented, custom rules offer teams a way to emulate these behaviors.
If you’re building UiPath projects at scale, build out your custom static rules. And keep an eye on formatting—the robots won’t care, but your teammates will.
.
In UiPath, automation logic is crafted through visual .xaml
workflows. Unlike traditional programming languages that utilize explicit constructs like main()
functions or class definitions to delineate roles, UiPath lacks a standardized mechanism to define the purpose of each workflow. Consequently, distinguishing between workflows serving as entry points, modules, or utility functions becomes reliant on naming conventions or folder structures.
This ambiguity presents challenges for static analysis:
-
Uniform Rule Application: Without clear role definitions, static analysis tools apply the same set of rules across all workflows, potentially leading to irrelevant or missed validations.
-
Maintenance Difficulties: Understanding the intended function of a workflow requires manual inspection, complicating maintenance and onboarding processes.
-
Inconsistent Best Practices Enforcement: Role-specific best practices (e.g., restricting business logic in
Main.xaml
) are hard to enforce without explicit role identification.
Traditional programming environments offer various mechanisms to define and enforce the roles of different code components:
-
Java: Utilizes annotations (e.g.,
@Test
,@Controller
) to specify the purpose of classes and methods. -
Python: Employs naming conventions and decorators (e.g.,
@staticmethod
) to indicate function roles. -
C#: Leverages attributes (e.g.,
[TestMethod]
) to define method purposes.
These explicit declarations facilitate targeted static analysis, allowing tools to apply context-specific rules and validations.
To enhance the precision of static analysis in UiPath, consider implementing a system to explicitly define workflow roles:
-
Role Annotations: Introduce a standardized annotation mechanism within workflows to specify their roles (e.g.,
@Role: EntryPoint
,@Role: Module
). -
Naming Conventions: Adopt consistent naming patterns that reflect the workflow's purpose, aiding both human understanding and automated tools.
-
Folder Structures: Organize workflows into directories based on their roles, providing an additional layer of context.
-
Custom Workflow Analyzer Rules: Develop custom rules within UiPath's Workflow Analyzer to interpret these annotations or structures, enabling role-specific validations. (UiPath Documentation)
Implementing explicit role metadata in UiPath workflows offers several advantages:
-
Enhanced Static Analysis: Allows for the application of context-aware rules, improving the accuracy and relevance of validations.
-
Improved Maintainability: Facilitates easier understanding of workflow purposes, aiding in maintenance and onboarding.
-
Consistent Best Practices Enforcement: Enables the enforcement of role-specific guidelines, promoting code quality and consistency.
-
Scalability: Supports the growth of automation projects by providing a clear structure and reducing complexity.
The absence of explicit role definitions in UiPath workflows poses challenges for static analysis and maintainability. By adopting a system of annotations, naming conventions, and folder structures to define workflow roles, and by extending the Workflow Analyzer with custom rules, organizations can achieve more precise validations, enforce best practices, and enhance the overall quality of their automation projects.
For more information on creating custom Workflow Analyzer rules, refer to the UiPath documentation:
.
Toward Context-Aware Rule Targeting in Visual RPA Development
UiPath projects comprise numerous .xaml
workflows that differ in function—some serve as entry points, others encapsulate reusable logic, and some exist solely for testing or support. However, UiPath Studio does not enforce or expose role metadata for these files, complicating targeted static analysis.
To support context-aware analysis, a structured, non-invasive system for inferring workflow roles is established. This model enables analyzers to selectively enforce rules based on workflow purpose, without altering the project.json
or relying on native Studio support.
In UiPath projects, where workflows are visual and not code-based, the absence of a dedicated linter makes it difficult to consistently identify the role of each .xaml file—such as whether it's a unit, module, or process. This ambiguity complicates targeted static analysis, since rule enforcement often depends on the intended role of the file.
Each workflow can be mapped to a canonical role, enabling rule targeting by intent:
Role | Description |
---|---|
process |
Top-level orchestration workflows; often listed as entryPoints in project.json . |
module |
Mid-level, reusable subprocesses or logical fragments. |
unit |
Small, focused logic blocks used within modules or processes. |
test |
Explicit test workflows; defined via project.json > designOptions > fileInfoCollection . |
util |
Standalone support workflows (e.g., configuration loaders, data transformers, cleanup routines). |
unknown |
Default fallback for workflows that don’t match any known category. |
A five-tiered strategy is applied for inferring roles:
Test workflows explicitly declared in:
"designOptions": {
"fileInfoCollection": [
{
"relativeFilePath": "Tests/Unit/TestCase_Math.xaml",
"testCaseType": "TestCase"
}
]
}
...are categorized as:
"role": "test"
This classification overrides all others.
Role inferred from suffixes in the file name:
-
Process.xaml
or*_process.xaml
→process
-
*_module.xaml
→module
-
*_helper.xaml
→helper
-
TestCase_*.xaml
→test
If the immediate folder name is:
-
process
→process
-
modules
→module
-
units
→unit
-
helpers
orutils
→util
-
tests
→test
…the role is inferred accordingly. This rule is case-insensitive.
When present, this root-level file allows direct override:
{
"workflowRoles": [
{
"fileName": "StandardCalculator.xaml",
"role": "process"
},
{
"fileName": "InitAllApplications.xaml",
"role": "module"
},
{
"fileName": "TransformText.xaml",
"role": "util"
},
{
"fileName": "PathKeeper.xaml",
"role": "unit"
},
{
"fileName": "Tests\\unit\\TestCase_Unit_ParseTermToList.xaml",
"role": "test"
},
{
"fileName": "UncategorizedWorkflow.xaml",
"role": "unknown"
}
]
}
Annotations within the root activity can express intent:
sap2010:Annotation.AnnotationText = "@role module"
Used only when higher-priority mechanisms yield no result.
If no indicators are found, role defaults to:
"role": "unknown"
Role-aware rule targeting enables:
- Enforcing stricter conventions for
process
workflows - Validating reuse patterns in
modules
vsunits
- Exempting
util
workflows from documentation checks - Skipping long-running rules on
test
workflows
Inferring roles from existing project structures allows high-precision, context-sensitive static analysis in UiPath. This layered system bridges the gap between developer intent and rule enforcement—without requiring structural overhauls or Studio dependency.
.
In development, the terms linter, static analyzer, and formatter get tossed around like interchangeable buzzwords. But when it comes to UiPath’s official Workflow Analyzer rules, understanding where each rule fits is key to using them effectively — or extending them with custom logic.
This article breaks down these roles and maps them against the real rules supplied by UiPath.
Tool | What It Checks | Fixes Code? | Goal |
---|---|---|---|
Linter | Naming, usage, minor style issues | Sometimes | Human-readable consistency |
Static Analyzer | Logic, structure, architecture | Rarely | Prevent design-time bugs |
Formatter | Whitespace, alignment, layout | Always | Visual/code consistency |
UiPath provides dozens of Workflow Analyzer rules out of the box. Some behave like linters (style enforcement), some like static analyzers (design integrity), and none behave like formatters (visual correction is absent in Studio).
Here’s how they divide:
These catch issues that affect behavior, architecture, and execution reliability.
Rule ID | Name | Why It’s Static Analysis |
---|---|---|
ST-DBP-003 |
Empty Catch Block | Discourages silent failures |
ST-REL-006 |
Infinite Loop | Flags workflows that may hang |
ST-DBP-025 |
Variables Serialization Prerequisite | Required for persistence readiness |
ST-SEC-009 |
SecureString Misusage | Security-sensitive pattern |
ST-DBP-024 |
Persistence Activity Check | Workflow design constraint |
These rules aren’t about formatting or preferences — they’re about preventing automation failure.
These enforce conventions and prevent human sloppiness, not crashes.
Rule ID | Name | What It Lints |
---|---|---|
ST-NMG-001 |
Variable Naming Convention | Variable prefix rules |
ST-NMG-008 |
Variable Length Exceeded | Style and readability |
ST-USG-009 |
Unused Variables | Hygiene: don’t carry dead weight |
ST-MRD-005 |
Redundant Sequences | Visual clutter |
ST-USG-032 |
Required Tags | Enforces tagging discipline |
These don’t affect how workflows run — just how they’re maintained and understood.
UiPath does not include any rules that format your workflows. There’s no auto-alignment, indentation enforcement, or container normalization.
A formatter in UiPath would:
- Align activities neatly on canvas
- Auto-space sequences consistently
- Normalize empty lines or layout padding
That doesn’t exist — and probably won’t, unless Studio adopts layout scripting or design rules.
If you're managing code quality in UiPath:
- Use static rules to catch critical design issues early (infinite loops, hardcoded values).
- Use linter-style rules to enforce naming consistency, hygiene, and clarity.
- Don’t wait for formatting support — document layout standards for your team.
Category | UiPath Workflow Analyzer Has It? | Examples |
---|---|---|
Static Analyzer | ✅ Yes |
ST-REL-006 , ST-DBP-024
|
Linter | ✅ Yes |
ST-NMG-001 , ST-USG-009
|
Formatter | ❌ No | (Not supported) |
UiPath’s built-in rules cover style and structure, but not layout. Knowing this helps you plan governance, choose what to enforce with custom rules, and where manual discipline still matters.
Rule Family | Rule ID | Category |
---|---|---|
Design Best Practices | ST-DBP-002 | Static Code |
Design Best Practices | ST-DBP-003 | Static Code |
Design Best Practices | ST-DBP-007 | Static Code |
Design Best Practices | ST-DBP-021 | Static Code |
Design Best Practices | ST-DBP-023 | Static Code |
Design Best Practices | ST-DBP-024 | Static Code |
Design Best Practices | ST-DBP-025 | Static Code |
Design Best Practices | ST-DBP-028 | Static Code |
Maintainability and Readability | ST-MRD-002 | Static Code |
Maintainability and Readability | ST-MRD-004 | Static Code |
Maintainability and Readability | ST-MRD-008 | Static Code |
Maintainability and Readability | ST-MRD-017 | Static Code |
Security | ST-SEC-007 | Static Code |
Security | ST-SEC-008 | Static Code |
Security | ST-SEC-009 | Static Code |
Reliability | ST-REL-001 | Static Code |
Reliability | ST-REL-006 | Static Code |
Project Anatomy Rules | ST-ANA-005 | Static Code |
Project Anatomy Rules | ST-ANA-006 | Static Code |
Project Anatomy Rules | ST-ANA-009 | Static Code |
Usage Rules | ST-USG-005 | Static Code |
Usage Rules | ST-USG-017 | Static Code |
Performance and Reusability Rules | ST-PRR-004 | Static Code |
Project Migration Rules | ST-PMG-001 | Static Code |
Project Migration Rules | ST-PMG-002 | Static Code |
Naming Rules | ST-NMG-001 | Linter |
Naming Rules | ST-NMG-002 | Linter |
Naming Rules | ST-NMG-004 | Linter |
Naming Rules | ST-NMG-008 | Linter |
Naming Rules | ST-NMG-009 | Linter |
Naming Rules | ST-NMG-011 | Linter |
Naming Rules | ST-NMG-016 | Linter |
Usage Rules | ST-USG-009 | Linter |
Usage Rules | ST-USG-010 | Linter |
Usage Rules | ST-USG-014 | Linter |
Usage Rules | ST-USG-020 | Linter |
Usage Rules | ST-USG-026 | Linter |
Usage Rules | ST-USG-027 | Linter |
Usage Rules | ST-USG-032 | Linter |
Maintainability and Readability | ST-MRD-005 | Linter |
Maintainability and Readability | ST-MRD-007 | Linter |
Maintainability and Readability | ST-MRD-009 | Linter |
Maintainability and Readability | ST-MRD-011 | Linter |
.
Modern UiPath activities like NTypeInto
, NClick
, and others encapsulate their UI interaction metadata in a structured Target
object — typically of type TargetAnchorable
. Unlike classic activities, which expose selector strings via flat Selector
or Input
properties, these modern activities abstract selector components into nested properties, arguments, and references.
The Target
object is not a simple string or flat argument. Instead, it contains:
-
Browsable and internal
Arguments
, such as:-
Strict selector
,Fuzzy selector
,CV Text
,Native text
-
-
Browsable and internal
Properties
, such as:-
Visibility check
,Targeting methods
,CV Control type
-
-
Deep
InternalProperties
, such as:-
WaitForReady
,Reference
,FullSelector
,CVScreenId
,OCRAccuracy
-
This structure supports multiple selector paradigms:
- Classic selectors
- Computer Vision (CV) descriptors
- Object Repository references
Accessing this data in a custom rule requires:
- Locating the
Target
property from the activity’s.Properties
list. - Traversing into
.Arguments
,.Properties
, and.InternalProperties
recursively. - Using specific
DisplayName
keys (e.g.,"Strict selector"
or"WaitForReady"
) to extract the correct value.
Example debugger command:
activity.Properties.First(p => p.DisplayName == "Target").InternalProperties.First(p => p.DisplayName == "WaitForReady").DefinedExpression
- Not all data is in
DefinedExpression
; some might require interpreting complex objects. -
Target
itself doesn’t expose a.Value
; everything must be extracted through Analyzer interfaces. - Many values are empty (
<null>
) unless explicitly configured in the workflow. - Object Repository links (
Reference
) do not expose metadata directly and require cross-referencing with project-level OR data.
Properly navigating the Target
structure enables you to:
- Audit UI automation strategy (selectors vs. CV vs. OR)
- Validate adherence to automation standards
- Trace hidden reliability issues (e.g., fallback to fuzzy selectors)
This depth of inspection is essential for building robust analyzer rules in enterprise-grade UiPath solutions.
.