/**
 * Task viability — is a selected task one the eval runner can actually run?
 *
 * The runner reads `ailf.task` documents from the Content Lake under the
 * **published** perspective (the `@sanity/client` default for any
 * `apiVersion >= 2025-02-19`) and excludes archived tasks. So a task is
 * viable iff it has a published version whose status is not "archived":
 *
 *   - unpublished draft (only `drafts.<id>` exists) → invisible to the runner
 *   - archived (published, but `status: "archived"`)  → excluded by the runner
 *   - no document at all                              → nothing to run
 *
 * This pure predicate is the single definition of "non-viable". The eval
 * fast-fail validation step uses it today; it is intended to also back a
 * future dashboard new-eval picker guard so the two never disagree. Each
 * caller gathers the `TaskPublishState` signal in its own way (a
 * `raw`-perspective GROQ probe on the backend; an App SDK drafts-visible read
 * in the dashboard) but classifies it here identically.
 */
import type { TaskPublishState, TaskViabilityReason, TaskViabilityResult } from "../types/index.js";
/**
 * Decide whether a task is runnable by the eval runner, and if not, why.
 *
 * Mirrors the runner's published-perspective read: viable iff a published
 * version exists and is not archived.
 */
export declare function classifyTaskViability(state: TaskPublishState): TaskViabilityResult;
/**
 * Human-readable, actionable explanation for a non-viable reason. Used in
 * the fast-fail error message (and available to a future dashboard picker's
 * disabled-task tooltip via the same shared predicate).
 */
export declare function describeTaskViabilityReason(reason: TaskViabilityReason): string;
