I
built Proctor for AgentHack Track 3 (Test Cloud) and wanted to share the testing approach, because the underlying problem shows up for anyone putting an LLM-backed automation into production.
The problem. An AI automation is non-deterministic: the same input rarely produces byte-identical output. That breaks the assumption underneath ordinary regression testing. Assert output == expected and you get a suite that either flakes constantly or, once you loosen it, quietly passes on garbage. The failure that actually costs money is the subtle one: someone bumps a model version or tweaks a prompt, the extraction is still structurally valid and still reads plausibly, but the line items no longer sum to the total.
The approach: a behavioral contract. Instead of asserting output, Proctor learns a contract per agent by running it over sample inputs and observing what is stable versus what varies. Two layers:
- Tiered field assertions: structural (is the field present and the right shape), exact (for deterministic fields like currency codes), and semantic (similarity within a tolerance band, for genuinely fuzzy text).
- Hard domain invariants: absolute properties that hold regardless of any baseline. Line items sum to total. Currency is internally consistent. Dates parse.
The invariants carry most of the weight. They need no baseline, so they still catch what matters even when everything else drifted legitimately.
The underrated part: a three-way verdict. Most testing splits results into pass/fail, or real/flaky. Agent output needs a third branch. When a check fails, Proctor classifies it as:
- real-regression: something genuinely broke
- legitimate-evolution: output changed but is still correct, so patch the contract rather than block the change
- flaky: within tolerance
That middle branch is what stops the system becoming the boy who cried wolf. A model upgrade that is genuinely better should not look identical to a bug.
Nothing mutates without a person. Any consequential verdict suspends a durable workflow on a human approval hook and routes the decision to Action Center. The workflow survives restarts and multi-day reviewer gaps, then resumes and records the outcome. Approved evolution versions the contract; a rejection changes nothing. Every decision leaves a receipt.
Verified live. Three surfaces against a Labs tenant with this exact code: an Orchestrator job via StartJobs, an Action Center task via GenericTasks/CreateTask, and test reports published to an Orchestrator queue. The Test Set execution path is wired but was not reachable on my tenant, so the queue is the live results channel.
Repo is MIT and runs keyless if you want to poke at it, no API key and no credentials required:
pnpm install && pnpm demo — GitHub - OrionArchitekton/proctor: Proctor — an agent that QAs other agents. UiPath AgentHack 2026, Track 3 (UiPath Test Cloud): durable regression-testing for non-deterministic AI automations. Built with Claude Code. · GitHub
Curious how others here are handling this. If you have an LLM-backed automation in production today, what is catching a silent behavior change before your users do?
