/**
 * Lost-task detection.
 *
 * For every task currently in `running` or `queued`, check whether its recorded
 * pid is still alive via `process.kill(pid, 0)`. If the pid is gone, the
 * runner crashed or was killed externally; flip status to `lost` so observers
 * (CLI list, agent prompt) stop misreporting it as in-flight.
 *
 * EPERM means the pid exists but we don't have permission to signal it —
 * treat that as alive. ESRCH (or anything else) means dead.
 *
 * Pid-less queued tasks: runner.ts writes its own pid on entry, so a task
 * with status=queued and no pid means the runner subprocess crashed during
 * module import (cliPath wrong, syntax error in dist) before it could record
 * itself. We reap these once they're older than QUEUED_NO_PID_TIMEOUT_MS so
 * `franklin task list` doesn't show them as eternally pending.
 *
 * Best-effort: PID reuse can lie. v3.10's contract is "lazy reconciliation
 * on `task list`"; v3.11 may add a pidStartTime cross-check.
 */
export declare function reconcileLostTasks(now?: number): number;
