Loopypeterzakin/loopy

example · workflows/resolve/

Resolve

Takes a WorkItem and drives it to done: decide the goal, implement it, review the PR, then ship.

The steps

4 steps in workflows/resolve/, run in order along the after-chain

workflows/resolve/
---
on: WorkItem
agent: Investigator
output:
  goal: str
---
Decide the goal for "{{ event.proposed_goal }}" given the work item at {{ event.link }}.
---
after: arbitrate
agent: Fixer
output:
  pr_url: url
  summary: str
---
Implement the goal: {{ arbitrate.goal }}. Open a PR and summarize the change.
---
after: fix
agent: Reviewer
output:
  verdict: enum[pass, fail]
---
Review {{ fix.pr_url }}: {{ fix.summary }}. Return a pass/fail verdict.
---
after: review
agent: Releaser
emits: GoalShipped
---
If {{ review.verdict }} is pass, merge the PR and ship the change.

The trigger

No sensor. resolve is triggered by the WorkItem event that triage and upkeep emit onto the bus.

From the registry

The agents and events this workflow refers to by name, from registry.yml.

registry.yml
defaults:
  agent:
    sandbox: default
    harness: { runtime: claude-code, model: claude-sonnet-4-6 }

sandboxes:
  default:
    provider: daytona
    image: { debian_slim: "3.12", apt: [git], workdir: /home/daytona, user: daytona }
    network: [github.com]

agents:
  Investigator: { skills: [code-review] }
  Fixer: { harness: { model: claude-opus-4-8 }, tools: [open_pr], skills: [testing] }
  Reviewer: { tools: [run_evals], skills: [code-review] }
  Releaser: { tools: [merge_pr, set_flags] }

events:
  WorkItem:
    fields:
      source: enum[sentry, linear, datadog, pagerduty, slack, cve]
      link: url
      root_cause: str
      proposed_goal: str
      repro: str

  GoalShipped:
    fields: { goal_id: id }
open on github → back to overview