Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ADR-0021: The no-judge task lane

Status: accepted | Date: 2026-08-17

References: ADR-0001, ADR-0004, ADR-0018, RFC-0001, RFC-0002

Context

Crucible had no lane for unsupervised agent chores with no objective ("consolidate dependabot PRs", "fix flaky tests nightly"). [judge] was required at the type level. Teams reached for external runners that hand the agent credentials and keep no durable state.

Decision

A manifest with no [judge] table builds TaskJudge: measure emits Reading with valid:true, score:None; decide keeps unconditionally; improved is unconditionally true; objective() returns "task". Rows keep the ordinary decision:"keep" shape with score:null. skip_baseline is forced on. Composites still require [judge]. A task manifest rejects [search], [workflow], and [preflight]. crucible check skips measure probe, editable-gate lint, and selftest, but requires a non-empty goal and prints a loud notice.

Consequences

Trust boundary untouched. Exit 0 means "run completed" not "chore succeeded". Summary.best_score and Segment.baseline_score became Option on the wire. Downstream dashboards reading decision=="keep" as "beat objective" must branch on gate=="task". RFC-0002 later reopened two of the restrictions above: a judgeless manifest now accepts [workflow] when its type is "playbook", and a judgeless composite is permitted without [judge] and produces no combined score. Both were closed here because a lane that keeps unconditionally had nothing to say about a graph; the playbook lane gives it a verdict that is not a score, which is what the restrictions were standing in for. The rest of the decision holds, and exit 0 means something stronger for a playbook than it does here.

Alternatives Considered

Absent [judge] = the task lane, with TaskJudge that keeps unconditionally (accepted)

[judge] mode = none: add a mode field to the existing judge config (rejected)

  • Rejected because: Adds a concept, makes every JudgeCfg field conditionally required.

[agent] mode = task: put the run semantics on the agent section (rejected)

  • Rejected because: Conflates proposal-policy with run semantics.

Separate one-shot subcommand for unjudged work (rejected)

  • Rejected because: Re-implements session Start/Row/Summary/Shutdown/publish/resume from scratch.