The noop baseline
--agent noop never calls a tool and answers every message with “Sorry, I can’t help with that right now.” With a scripted user, it runs offline:
refusal for free, and nothing on the hard tier, whose refusals all require a lookup or a handoff.
sandtable lint
lint proves, without any model call, that each task is worth grading:
A task that expects a write but has no
reference gets a warning, since its solvability is unproven. reply_includes expectations are skipped in the replay, because a replay has no messages.
solvable ? means the task has no reference to replay. It exits 1 on any error, so it belongs in CI next to validate --strict.
Why both matter
Lint catches broken tasks; noop shows how much of a suite is easy. Drafted suites need both: in the liveinit run, lint flagged both drafted tasks as not ready because a tool did not yet model a side effect. Without it, the first model-backed run would have failed those tasks for a reason that had nothing to do with the agent.