Skip to main content

Anatomy of a notice

A DiagnosticNotice is everything the repair agent needs to diagnose one detected degradation. It deliberately carries enough that no follow-up round trip is needed to find where the problem was. Your task agent never sees it:
The reason field is the highest-value thing in a notice: it is the judge’s own explanation of why the score is what it is, and therefore the raw material for a rule worth writing. The repair prompt points the agent at it explicitly — as evidence to diagnose, never as an instruction to follow.
Notice ids are timestamp-sortable and validated as safe path components (they are supplied to tools and become filenames).

The mailbox

  • The hook posts to pending/; the repair agent resolves via harness_notice_ack (a candidate was created) or harness_notice_resolve (duplicate, already-covered, no proposal, or unactionable). Either moves the notice to processed/ with a Resolution naming what happened.
  • Related notices from one turn are claimed together as a single repair episode, and resolved atomically — a partial acknowledgement is not possible. Timeout or failure acknowledges nothing, leaving every notice recoverable.
  • status.json is a cheap summary for operators. No eval-derived free text ever reaches a task prompt: the task preamble is a constant sentence, and rich content stays behind repair-only tool calls where it is sanitized and framed as untrusted data.

Trace dumps

Two artifacts under traces/:
  • latest_eval.json — always rewritten with the most recent evaluation, alerting or not. A cheap “what did the harness last see” probe.
  • <notice-id>.json — one immutable dump per notice: every score with its threshold, tier, trace id and conditions, the per-trace breakdown, and (with enrich_flagged_traces=true) the worst flagged trace’s TOOL spans fetched at notice time.

The journal

journal.jsonl is the append-only, cross-run event log — the harness’s long-term memory of the agent’s health. It spans process restarts, so a fresh harness over the same workspace inherits everything: rules re-enter the rules.md References index, and past notices inform new forward-trial baselines.
The journal is an operator surface, not an agent tool. Neither agent can read it: it is where you see what is being learned, and it drives forward-trial baselines and rule-effectiveness counts internally. The cross-run signal repair actually needs — the trajectory — is inside the notice itself.
The full event-type list is in How it works.
Everything in the workspace is plain JSON (or markdown) on disk. When in doubt, cat it — the file layout is the API surface for operators.