"\n
Your cron fired. Your agent reported success. The exit code was 0. And the work never happened. Schedulers verify execution; heartbeat monitors verify that the agent itself pinged \u2014 self-report with a deadline. Neither ever looks at the work. This watchdog does: each scheduled job declares an outcome contract \u2014 the artifact that must exist in the world (file, URL, or record: present, non-empty, fresh, optional hash/marker) \u2014 and the watchdog verifies the artifact itself, never the agent's claim, issuing VERIFIED / COMPLETED_UNVERIFIED / STALLED (no progress checkpoint within the job's own wall-clock budget, heartbeat notwithstanding) / MISSED verdicts, with hash-chained receipts bound to the artifact hash and a last_verified_success API that answers \"when was my last verified success?\". Multi-stage jobs can declare a chain contract: each stage's artifact is the next stage's required input, and the first broken seam is named (seam_0, seam_1, ...).
A VERIFIED verdict means the watchdog itself fetched, hashed, or read back the declared artifact and found it present, non-empty, and fresh within the run window \u2014 it does not guarantee that a VERIFIED artifact is correct in content beyond the contract's declared checks (existence, non-emptiness, freshness, optional hash/marker/key); contract design is the operator's. The roughly 29% dead-job rate in the launch evidence was reproduced on an evidence-shaped synthetic fleet; it is NOT a field measurement \u2014 the live-fleet census recorded by this service is census v2, a FIELD MEASUREMENT: verdicts computed from each real job's own systemd scheduler record and its real outcome artifact - no fixture jobs were registered, shaped, or run. Its latest run (2026-10-22) enumerated 135 live timers, evaluated 101 due jobs, and measured a dead rate of 0.0099 (verified rate 0.9901); it is published in its monitoring with its method and label. No batch-activity prediction, no dependency-graph construction from scheduler feeds, no failure-recovery automation, and no timestamping service is offered.
\nPrices: Per-verdict API $0.002/check (x402) \u00b7 Operator $9/mo per operator (up to 100 jobs, hourly verification cadence cap per job, 72,000 checks/mo included ceiling; checks beyond the cap bill at $0.002/check) \u00b7 Fleet $29/mo per operator (up to 1,000 jobs, hourly cap, 720,000 checks/mo included ceiling). First 100 checks free, one time per operator (account + payer wallet bound) \u2014 there is no perpetual free tier. Support: support@textforagents.com
\nEndpoints: GET /health, POST /register, POST /trial/claim, PUT /artifacts/<path>, POST /tools/register_job, /tools/start_run, /tools/checkpoint, /tools/complete_run, /tools/verify_now, /tools/watchdog_tick, /tools/last_verified_success, /tools/list_verdicts, POST /verify, GET /verify-key, POST /subscribe, GET /account, POST /account/alert, GET /alerts, POST /tokens/rotate, POST /tokens/revoke, DELETE /account/data, POST /mcp. Full machine-readable spec: /openapi.json. x402 discovery: /.well-known/x402.
\nfile: {\"type\":\"file\",\"path\":\"reports/daily.html\",\"min_bytes\":10,\"sha256\":\"optional\"} \u2014 verified against the artifact in your scoped store (PUT /artifacts/reports/daily.html) or, for record contracts, a JSON file whose declared key must be present and non-empty: {\"type\":\"record\",\"path\":\"state.json\",\"key\":\"published_id\"}. url: {\"type\":\"url\",\"url\":\"https://your-host.example/post\",\"contains\":\"optional marker\",\"sha256\":\"optional\"} \u2014 the watchdog fetches the URL itself; the URL's host joins your declared host allowlist at registration, redirects off the allowlist are blocked, and link-local/metadata hosts are refused (SSRF discipline). chain: {\"type\":\"chain\",\"stages\":[contract, contract, ...]} \u2014 each stage's artifact is the next stage's required input; seams are verified in order and the first broken seam is named seam_<i>. Registration rejects path traversal, absolute paths outside your store, and symlinks; verification re-checks confinement (a swapped-in symlink verdicts path_escape_at_verify, never crashes, never verifies). Empty or oversize (>10 MB) artifacts are refused as unverified. Checkpoint flood cap: 10,000 per run.
\nPlain cron: wrap the job \u2014 (1) run_id=$(curl -s -X POST https://textforagents.com/products/scheduled-agent-outcome-verification/tools/start_run -H \"Authorization: Bearer $TOKEN\" -d '{\"job_id\":\"nightly\"}'); (2) run your job, calling POST /tools/checkpoint with {\"run_id\":...} as stages complete and PUTting each declared artifact to /artifacts/<path> (or letting the job write its URL/record where its contract points); (3) POST /tools/complete_run with {\"run_id\":...} \u2014 the verdict comes from the artifact, not your exit code; (4) a separate watchdog cron line calls POST /tools/watchdog_tick every few minutes so STALLED/MISSED verdicts fire even when a run never completes. Agent frameworks (LangGraph, CrewAI, Mastra, OpenAI Agents and similar): the same calls map 1:1 onto the MCP tools at POST /mcp (register_job, start_run, checkpoint, complete_run, verify_now, watchdog_tick, last_verified_success, list_verdicts) \u2014 register the job at schedule creation, checkpoint from node/crew step callbacks, complete_run at graph end. Any HTTP client can do this; no SDK is required.
\nSet an operator webhook with POST /account/alert {\"webhook\": \"https://...\"} (or alert_webhook at /register). Verdicts that need a human \u2014 COMPLETED_UNVERIFIED, STALLED, MISSED \u2014 are POSTed to it as {\"product\": ..., \"receipt\": ...} and every delivery attempt (and its result) is recorded and readable at GET /alerts. Without a webhook, attempts are still recorded as \"no webhook configured\" so the alert path is auditable.
\nMetered checks are complete_run and verify_now. Operator/Fleet plans include checks up to the ceiling (72,000 / 720,000 per month) with an hourly verification cadence cap per job: a plan-included check for a job is available at most once per hour; a check inside the hour, or beyond the ceiling, bills at the per-verdict $0.002/check price via x402. Job caps: Operator 100 jobs, Fleet 1,000 jobs. The first 100 checks are free, one time per operator (bound to the account and the payer wallet); after the grant, every check bills. Receipts are Ed25519-signed and hash-chained, bound to the artifact hash at verification time; POST /verify re-checks a receipt's signature. Keep-clears (LEGAL-226 FTO keep-clear conditions, standing discipline): K-1 (toward US12190166B1): this service offers no cross-platform batch-activity prediction surface, constructs no dependency graph from scheduler or file-transfer event feeds, and makes no failure-recovery automation determination \u2014 it issues verdicts and alerts only. K-2 (toward US8006094B2): its hash-chained receipts stay its own internal verdict record; it makes no trustworthy-timestamp or certifiable-clock offering. Support: support@textforagents.com
\n"