ULUOPS
UluOps

What happens after
your agent finishes?

You read the output. Then the session ends, and next week the same agent finds the same things and argues the settled ones again.

$
$ npx @uluops/setup
Scroll
  • What if the agent could see that you already decided that one was a false positive, and why?
  • What if the same defect came back after a fix, and you knew it was the same one?
  • Which of your agents actually find things that matter?
  • What if decisions are being made faster than anyone writes them down?

The first is half-built: the decision and its reason are on the record; the agent reading it back is being built.

The operations layer for agentic work.

Git remembers what changed. UluOps remembers what was decided — what was decided about what the agents found: fixed, deferred, wontfix, false positive, or noted and left alone, with the reason.

Why this isn't observability

Observability tells you what the agent did. UluOps tells you what it found, what you decided about it, and whether it came back.

a trace
agentmodeltooloutputtokenslatency
a UluOps run
runfindingsissuesdecisionnext run

The trace is about the run. UluOps is about the finding, and the finding outlives the run.

Runs are the unit of agentic work.

Findings are what a run produces.

Issues are findings with a status and a history: the decision, and its reason, on the record.

One finding, three states

A fingerprint is a finding's identity: agent, file, category and title, hashed together, so the same finding is recognised across runs. This is a real project's log, newest first, cut down to one finding and the runs around it.

$ ulu log -p mcp-tool-surface-sweep
regressed 2026-09-28 01:11 051939f7e71c "T1: save_run without idempotency_key duplicates runs on retry despite identical payloadHash" via run #4 by agent
run #4 2026-09-28 01:10 tool-sweep tool-sweep-validator score -, gates -
new 57 . recurring 0 . regression 3
…
decided 2026-08-22 23:02 051939f7e71c fixed <- open "Fixed both ends: API falls back to payloadHash dedupe for keyless saves (mutations.ts, migration 082 index); ops-sdk ..."
…
run #1 2026-08-22 01:20 tool-sweep tool-sweep-validator score -, gates -
new 16 . recurring 0 . regression 0

Same fingerprint, three states. Run #1 found it. It was decided fixed the same day, and the reason says what changed. Five weeks later run #4 found it again, and the log knows it is the same finding, with the August decision still attached. The line in the middle is the one git could not have held.

One honest limit: a fingerprint survives a fix and a regression. It does not survive a rewritten title, so a finding the agent re-describes looks new. That gap is known and tracked.

Built by operating it
1,697
Runs examined
29,432
Findings tracked
19,121
Marked fixed
581
Published definitions

What came back, January 2026 to 2026-10-23

7
Caught by re-running: a later run found a fixed finding again
6
Reopened by decision: a resolved finding reopened by a person or an agent, with no run involved

Counts, not rates, and nothing here says how many were missed.

Our own record, not a benchmark: one operator, 40 weeks, 29,432 findings tracked. Read from the tracker, not typed.

as of 2026-10-23 · 257 of the 581 published definitions are agents

Get started

Install, restart, run.

  1. 01

    Install

    npx @uluops/setup asks whether you're new. Sign up with an email and password, or paste an API key you already have; --signup skips the question. It installs 23 agents and 28 commands into Claude Code, OpenCode, Gemini CLI or Codex; --all-detected installs into every harness it finds.

  2. 02

    Restart the harness

    The agents and commands load when the harness starts, so restart it once after setup.

  3. 03

    Run

    In a repo you own, run the first validator. Runs and findings are saved to a hosted tracker at app.uluops.ai, under your account.

$ npx @uluops/setup
> /agents:validate .

Works in Claude Code, OpenCode, Gemini CLI and Codex. The registry holds 257 published agents; setup installs a curated 23 of them.

Pricing

Start free. Pay for room.

The catalog, the issue lifecycle and every analytics view are free on every tier. Tiers meter workspace: projects, private definitions, members. Agents generate more than anyone can hold in their head, and the audits and the decisions about them need somewhere to sit and scale.

On every tier, including Free

  • All 581 published definitions — 257 agents, 226 commands, 75 pipelines, 23 workflows
  • Findings tracked as issues, fingerprinted across runs, regressions caught
  • Every decision on the record with its reason — fixed, deferred, wontfix, false positive, observation
  • Every analytics view: agent reliability, trends, taxonomy, cost, cross-project
  • MCP servers, CLI and SDKs — bring your own model key

Free

$0forever

The whole product, for one person and a few repos.

  • 3 projects · 5 private definitions
  • 1 member
Start free

Hobbyist

$9/mo

Room for the repos you actually run agents against.

  • Everything in Free
  • 10 projects · 25 private definitions
  • 3 members
Start free, upgrade later

Plus

$22/mo

A team's worth of projects and the people who decide on them.

  • Everything in Hobbyist
  • 50 projects · 50 private definitions
  • 10 members
Start free, upgrade later

Pro

$50/mo

Stop counting. Unlimited projects and private definitions.

  • Everything in Plus
  • Unlimited projects & private definitions
  • 25 members
  • Priority support
Start free, upgrade later

Enterprise

Custom

Unlimited members. Dedicated support.

  • Everything in Pro
  • Unlimited projects & private definitions
  • Unlimited members
  • Dedicated support
Contact us

Rate limits apply on every tier. Monthly billing, no contracts; downgrade and your history stays — nothing is deleted.

The System

Four layers. One record.

Definitions become runs. Runs produce findings. Findings become issues with a decision and a history, and the next run is read against them.

257 agentsADL · CDL · WDL · PDL

Registry

DEFINE

Agents, commands, workflows and pipelines as versioned YAML definitions, published to a shared registry: 257 published agents across validators, analysts, explorers, forecasters, generators and executors.

Tracker

RECORD

Runs save their findings as issues, identified across runs by fingerprint: new, recurring, or a regression when a fixed one comes back. Every status change stays in the issue's history, with the reason given.

The corpus

FIND

Beside the engineering validators sit 109 cognitive-lens agents (Machiavelli, Husserl, Wang Yangming and others) that read an artifact the way a discipline would. They are why the findings are worth tracking. How agents audit agents is on the research page.

SDK & MCP

INTEGRATE

MCP servers give the harness direct access to the tracker and the registry. The SDK and the ulu CLI cover everything else.

Two Interfaces

Define. Run. Decide.

Illustrative mockups of the tracker and the registry. The numbers in them are samples; the real ones are in “Built by operating it” above.

app.uluops.aiillustrative
++++
▶OPS-ULUOPS-REGISTRYDASHBOARD
87
3open
14fixed
2deferred
[ VALIDATORS ]
↑code-validator92
→security-analyst88
↓test-architect78
registry.uluops.aiillustrative
code-validatorv2.1.0
PUBLISHEDCOMMUNITYsoftware

Validates code quality, standards compliance, test coverage, and best practices. Blocks progression if critical issues found.

Scoring0–100 · 6 dimensions · 48 checks
Executions1,247 runs · 12 projects (sample)
Authoruluops
Execution History1,247
code-qualitytypescriptsecurity
ONE RECORD
For Developers

SDK-first design

Five packages. One pipeline. The SDKs handle auth, type safety, and error handling. The CLI ties them together.

Save runs, track issues, query analytics. The operations layer.

$ npm install @uluops/ops-sdk
example.ts
import { OpsClient } from '@uluops/ops-sdk';
 
const client = new OpsClient({
apiKey: process.env.ULUOPS_API_KEY,
});
 
// Save a run
const run = await client.runs.submit({
project: 'my-app',
agent: 'code-validator',
score: 87,
issues: findings,
});
 
// Query project analytics
const trends = await client.analytics.getTrends(
'my-app'
);