Private beta

Did
run last night?

If you can't answer that, Weev can — for the jobs you already have. One outbound-only agent sees what SQL Server Agent, Task Scheduler and cron already run, and turns every run into evidence. Nothing migrates until you want it to.

No migrationNo inbound port, everEvidence in under an hourThe Weev agent · Upcoming

01 · The problem

One night of jobs, end to end

The same seven jobs as the graph above, running on cron instead. Four are in a crontab, two are in a runbook, one is in someone's head. Nothing checks that the job before it finished — so when fx_rates overruns by forty minutes, everything downstream runs anyway.

00:0002:0004:0006:00
ledger_close41m
fx_rates54m

Ran 40 min long

fee_accrual50m
recon_batch46m

Started before fx finished

nightly_settlement60m

Settled on stale rates

regulatory_exportlate
retention_sweepskipped
Ran cleanRan without its inputMissed its deadline or never ran

02 · The ladder

The Weev agent · Upcoming

Escalate one job at a time

Install one outbound-only agent. Within the hour it has found what your schedulers already run. Then each job climbs at its own pace — and steps back down just as mechanically.

01 · Read-only

Observe

The agent discovers the jobs your schedulers already run and streams every run into Weev as a tamper-evident record. Nothing changes on the box.

02 · Wrap

Adopt

The incumbent stays the execution engine; Weev owns the clock, not the run. Same job, same code — the schedule and the record move.

03 · Fire

Own

Weev fires the job through the agent on its declared schedule and dependencies. The incumbent's entry retires.

04 · Full lifecycle

Native

The job is declared in Weev and executed by the agent with the complete lifecycle — held, leased, heartbeated and accounted for like any SDK job.

The rung is chosen per job, recorded per run, and every step has a mechanical rollback. The incumbent keeps firing until Weev owns the run — the cutover you already know, one rung at a time.

03 · The deepening layer

Declare it when
you're ready

Observation needs no code change. When a job graduates — or was born HTTP-reachable — the dependency moves out of a comment and into config that ships on your branch: in the SDK today, or in one weev.yaml when Link Mode lands.

Before · crontab + runbook

0 2 * * * run_settlement.sh
  # after ledger_close
  # (usually done ~1:40?)
  # retry: runbook §4
  # ping #payments if it fails

Four facts about this job, none of them enforced by anything.

After · SDK Mode

Today

weev.job({
  name: "settle",
  batch: "nightlySettlement",
  predecessors: ["reconBatch", "feeAccrual"] },
  async (ctx) => legacy.settle(ctx));

After · Link Mode

Upcoming

batches:
  nightly-settlement:
    jobs:
      settle:
        http: { path: /jobs/settle }
        after: [recon-batch, fee-accrual]

Same declaration, two doors. In the SDK your script is the last line, unchanged; in Link Mode an endpoint you already have becomes the job, zero code. Either way it is reviewable, versioned and validated.

0
cycles

A job cannot end up waiting on itself through four hops of indirection.

9
edges checked

Every declared dependency resolves to a job that exists and is scheduled to run.

1
place to look

The graph is the schedule. There is no second copy in a runbook to fall out of sync.

// checked on push, not at 02:00

04 · The record

Every run, accounted for

The run, its trigger, its upstreams and its logs in one place — not a Slack alert with a script name in it.

RUN 8F21C · nightly_settlement · v3● RUNNING 00:47
02:00:01  triggered by: graph · deps satisfied (2/2)
02:00:01  heartbeat · payments-01
02:00:47  settling 41,208 rows
02:00:47  holding regulatory_export until complete
UPSTREAM
recon_batch · cleared 01:14
fee_accrual · cleared 01:49
DOWNSTREAM
regulatory_export · held

05 · The console

Every job, every environment, one screen

What is running, what is blocked, what failed and what is due next — scoped to a project and an environment. This is where the question at the top of this page gets answered.

payments
production
M
Console
Active Runs
2
Failures (24h)
3
Queue Depth
1
P95 Duration (24h)
4.2s
Success Rate (24h)
94.2%
Active Now
View all in Feed →
nightly_settlement
run-8f21c
running
3/5
2m 34s2m ago
regulatory_export
run-8f22a
blocked
0/2
—Just now
retention_sweep
run-8f22b
queued
0/1
0sJust now
Next Up
View all schedules →
ledger_closeIn 15 minutes
Daily at 02:00
fee_accrualIn 2 hours
Every 6 hours
recon_batchTomorrow at 02:00
Daily at 02:00
Recent Failures
View all failures →
fx_rates
fetch_provider_rates
3x

Connection timeout to rate provider after 30s

1m 12s5m ago
Five numbers answer the morning question before you read a single row: what is active, what failed, and what is stuck in the queue. Every card is a link into the run that caused it.Read the docs →

Start with the job you check every morning.

No new runtime, no port. Cron keeps firing until Weev owns the run — then you delete the line.