Harness
Reference

Every event the loop writes to its log and emits on its bus, with the fields it carries.

View raw Markdown · llms.txt · For agents

Every loop event is appended to <stateDir>/events.ndjson and emitted on the plugin bus, with at (ISO timestamp) and type on top of the fields below. A plugin subscribes with bus.on('<type>' | '*', listener); a notification channel subscribes by listing types in notifications.events.

The vocabulary is enforced by the compiler: appendLoopEvent accepts only these names, so an event that is not here cannot be emitted — and a name here that nothing emits fails the test suite.

63 loop events.

contract.*

EventCarriesWhat it means
contract.escalatedissue, reasons, digestA contract was frozen but is not dispatchable; a human was asked to settle it.
contract.failedissue, errorContract generation failed on every candidate provider.

plan.*

EventCarriesWhat it means
plan.votedissue, cycle, approvals, votesOne planning cycle finished: how many agents approved the plan, out of how many voted.
plan.failedissue, errorPlanning failed on every candidate provider.
plan.escalatedissue, cycles, unresolvedThe cycles ran out without consensus; the unresolved objections are a human's to settle.

worker.*

EventCarriesWhat it means
worker.dispatchedissue, worktree, worktreeId, branch, terminal, provider, model, contractDigest, briefDigest, command, briefAccepted, tuiIdleA worker was launched in its own worktree. Carries the whole dispatch record plus the command that ran.
worker.dispatch-failedissue, errorThe dispatch itself failed — worktree, terminal or brief — before any work started.
worker.setupissue, worktreeId, okproject.setup.command ran in the fresh worktree.
worker.nudgedissue, kind, reason, worktreeIdAn idle worker was nudged in its own terminal — and also the terminal outcome nudged, which ends a delivery pass on the same issue. Two emissions, one name: kind is present on the first, reason on the second.
worker.reactivatedissue, terminal, previousTerminalA stale terminal was relaunched for a worker that was still supposed to be working.
worker.reopenedissue, pr, previousHead, head, previousOutcomeA finished issue came back: a new head on a PR the loop had already closed out.
worker.handed-offissue, from, to, worktreeId, branch, reason, briefAcceptedThe task was handed to another provider in the same worktree, on the same branch — and also the terminal outcome handed-off that ends the delivery pass which did it.
worker.ci-roundissue, pr, head, roundCI is red; the failing checks went back to the worker as a fix round.
worker.review-roundissue, pr, head, roundThe review found blocking issues; the findings went back to the worker as a fix round.
worker.conflict-roundissue, pr, head, roundThe PR conflicts with the base branch; the rebase instruction went back to the worker. It costs no fix round.
worker.mergedissue, reason, worktreeIdDelivery finished for this issue: the pull request was merged and the issue closed out.
worker.heldissue, reason, worktreeIdHeld for a human: protected paths, a secret-shaped file, a crossed layer boundary, or a gate the config demands.
worker.blockedissue, reason, worktreeIdBlocked: the fix rounds ran out, or a circuit breaker stopped the dispatch.
worker.stuckissue, reason, worktreeIdThe worker stopped producing output for longer than the idle timeout and could not be revived.
worker.abandonedissue, reason, worktreeIdThe pull request was closed without merging, or the branch disappeared.
worker.failedissue, reason, worktreeIdThe delivery pass itself failed - a tool, a credential, an unexpected state.
worker.waitingissue, reason, worktreeIdNothing to do at this head: the pass ended waiting for CI, a push, or a human.
worker.reviewedissue, reason, worktreeIdThe review ran and the pass ended there, without merging.
worker.fix-roundissue, reason, worktreeIdThe pass ended by sending the worker back to work.

pr.*

EventCarriesWhat it means
pr.reviewedissue, pr, head, status, blocking, provider, model, sourceA review ran against a PR, with the verdict and who gave it. source marks a PR that came from GitHub intake.
pr.mergedissue, pr, head, shaThe PR was squash-merged by the loop.
pr.merge-refusedissue, pr, head, messageGitHub refused the merge — branch protection, a required check, a race with another merge.
pr.smoke-failedissue, pr, head, detailThe optional post-merge smoke failed.

github-intake.*

EventCarriesWhat it means
github-intake.mergedpr, reasonMerged by the loop.
github-intake.heldpr, reasonHeld for a human.
github-intake.blockedpr, reasonOut of fix rounds.
github-intake.failedpr, reasonThe pass over it failed.
github-intake.stuckpr, reasonIt stopped moving.
github-intake.abandonedpr, reasonClosed without merging.
github-intake.waitingpr, reasonNothing to do at this head.
github-intake.reviewedpr, reasonReviewed without merging.
github-intake.fix-roundpr, reasonSent back to its author.
github-intake.nudgedpr, reasonIts author was nudged.
github-intake.handed-offpr, reasonIt changed hands.

release.*

EventCarriesWhat it means
release.waitinghead, branch, commits, issues, detailA batch is on the integration branch with nobody's approval behind it. Emitted once per head.
release.promotedhead, branch, commits, issues, approvedByThe approved batch reached the release branch.
release.deployedhead, branchThe deploy command succeeded.
release.failedhead, phase, detailPromotion or deploy failed; phase says which.
release.smoke-failedhead, detailThe post-deploy smoke failed.
release.rolled-backhead, ok, detailThe rollback ran after a failed smoke; ok says whether it worked.

intake.*

EventCarriesWhat it means
intake.filedissue, source, fingerprint, severityAn external alert became a tracked issue.

maintain.*

EventCarriesWhat it means
maintain.filedissue, check, fingerprintA maintenance check became a tracked issue.

memory.*

EventCarriesWhat it means
memory.recalledissue, hits, docBridgeBefore, docBridgeAfter, approxCharsSaved, memoryDigestApproved memory was recalled into a prompt, with what it cost and what it saved.
memory.auto-promotedids, remembered, digestLearnings the retro promoted into memory without a human in the middle (memory.autoPromote).
memory.auto-promote-failederrorThe automatic promotion itself failed; the learnings stay in the ledger.

provider.*

EventCarriesWhat it means
provider.cooldownprovider, kind, until, sourceA provider was put on cooldown after a quota/auth/timeout failure. source names the caller when not a dispatch.

queue.*

EventCarriesWhat it means
queue.claim-failedissue, assignee, errorThe tracker refused the claim that reserves an issue for this loop.

security.*

EventCarriesWhat it means
security.pii-detectedissue, source, kinds, countText that looks like PII was found before it reached a model.

issue.*

EventCarriesWhat it means
issue.pausedissue, kind, consecutive, reasonAn issue was paused after consecutive failures; it needs a human before it is tried again.

stage.*

EventCarriesWhat it means
stage.pausedstage, reason, consecutiveFailuresA whole stage was paused after consecutive failures.

agent.*

EventCarriesWhat it means
agent.adoptedrole, agent, detailThe retro's agent-improvement pass adopted a dated note into the agent's instructions; the eval passed.
agent.rejectedrole, agent, detailNothing was adopted: no installed agent for the role, or nothing to measure the change with.
agent.needs-humanrole, agent, detailA proposal was recorded for a human: a critical role, too many lines, or an agent that is code.
agent.revertedrole, agent, detailThe change was applied, the eval did not pass, and the file was put back exactly as it was.

tuning.*

EventCarriesWhat it means
tuning.appliedpath, from, to, metric, reasonA tuning knob moved by itself after a retro, inside its declared range and justified by its declared metric.
tuning.revertedpath, from, to, metric, reasonThe same knob moved back, because the metric that justified the change got worse.

cost-guard.*

EventCarriesWhat it means
cost-guard.trippedissue, reasonThe cost circuit breaker stopped a dispatch that burned more usage than resilience.maxUsageDeltaPercent allows.

max-duration.*

EventCarriesWhat it means
max-duration.trippedissue, reasonThe time circuit breaker stopped a dispatch older than delivery.maxDispatchMinutes.

Harness run events

A separate, older vocabulary: the run-level event log the harness keeps for a single verification run (HARNESS_EVENT_TYPES), independent of the loop.

  • run.created
  • state.transitioned
  • context.attached
  • verification.completed
  • artifact.recorded
  • approval.recorded
  • authorization.recorded
  • session.started
  • session.resumed
  • agent.turn.started
  • policy.evaluated
  • tool.approval.requested
  • tool.approval.recorded
  • tool.requested
  • tool.execution.started
  • tool.recovery.recorded
  • tool.blocked
  • tool.completed
  • tool.failed
  • session.ended

On this page