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.

72 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.
contract.generatedissue, provider, model, effort, digestA contract was frozen successfully. provider/model/effort are what actually produced it — the join key for comparing how different LLMs (at what reasoning effort) did on the same kind of issue.

plan.*

EventCarriesWhat it means
plan.votedissue, cycle, approvals, votes, votersOne planning cycle finished: how many agents approved the plan, out of how many voted, and who each one was.
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, effort, contractDigest, briefDigest, command, briefAccepted, tuiIdle, workerGuardInstalledA 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.permission-waitissue, terminal, reasonThe worker stopped at a tool-permission prompt: held for a person, never typed into. Once per idle window.
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, profile, votes, minSeverity, source, calls, inputTokens, outputTokens, totalTokensA review ran against a PR, with the verdict, who gave it, how it was configured (profile/votes/severity floor) and what it cost (calls/token fields, from agentskit-review's own usage tracking) — what a study comparing review thoroughness and spend across models needs. 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.human-approvedissue, head, by, prA person attested a PR held for protected paths, for exactly this head.
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.
provider.callrole, provider, model, effort, issue, durationMs, exitCode, timedOut, stdoutBytes, stderrBytesOne call the harness itself made to a provider CLI (contract, review, plan vote — never the worker's own dispatched session, which stays opaque). Always carries timing/size; providerCalls/token fields are present only when the caller could parse them out of that call's own structured result.
provider.usage-observedissue, provider, initialRemainingPercent, currentRemainingPercent, deltaPercentHow much of a provider's usage window moved for one in-flight issue since its dispatch — logged on every deliver pass regardless of whether it crosses resilience.maxUsageDeltaPercent, so the trend is visible before it ever trips the breaker.

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.
stage.completedstage, durationMs, status, countOne scheduled stage run finished — the entrypoint every scheduler (cron, Orca) calls, so this is the one event that always exists regardless of what the stage itself did.

config.*

EventCarriesWhat it means
config.changedfrom, toloop.config.yaml changed since the last stage run; from/to are its digest before and after.

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.

dod.*

EventCarriesWhat it means
dod.assessedissue, pr, head, complete, proven, missing, failedThe definition of done was judged for a PR: how many of its lines were proven, missing, or failing.

verify.*

EventCarriesWhat it means
verify.passedissue, pr, headThe project's own delivery.verify.argv passed before a review was even requested.

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