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
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.