DVT SCHEDULER

PORT :46106 · STARTS WITH dvt serve · WRITES ANSWER LOOPBACK ONLY

Your dvt commands on a cron — or saved with no schedule at all, waiting for you. The scheduler is deliberately an honest local scheduler: jobs fire while it runs (it comes up with dvt serve), it is not a hidden daemon, and everything it does is visible — history, logs, and honest per-run feedback.

Starting and stopping

dvt serve                    # the suite, scheduler included
dvt serve -s scheduler       # just the scheduler
dvt kill -s scheduler        # stop just the scheduler
dvt kill --exclude scheduler # stop everything EXCEPT the scheduler
                             # (the UIs go down, the schedule keeps firing)

No serve, no schedule: a job whose minute passes while the scheduler is down is missed, not queued. For servers this is what you want — the process is under your supervision, not hiding behind an init system.

Creating jobs

A job is a plain dvt command plus a schedule. Commands are verb-whitelisted — run, build, test, seed, snapshot, compile, docs, sync, retract, clean — executed as arguments, never through a shell. Shell metacharacters in arguments are refused at save time, and duplicate job names are rejected.

  • schedules are dropdownspresets (hourly, daily @ 06:00, weekly, every 15 minutes) or a custom cron composed from five labeled dropdowns — minute, hour, day of month, month, weekday. Nobody hand-types */15 6 * 7 5.
  • manual-only modeflip the schedule mode to 'manual only' and the job has no cron at all: a saved, validated command you fire with RUN NOW whenever you need it. Its card says 'run it when you need it'.

Running and controlling

  • RUN NOWfires any job immediately, scheduled or manual — recorded in history with trigger 'manual'.
  • overlap guarda cron tick that would overlap a still-running previous run records 'skipped' instead of stacking two builds on top of each other.
  • KILLevery running job shows a KILL button. Jobs run in their own process group, so KILL terminates the entire tree — dvt and its Sling children — SIGTERM first, SIGKILL five seconds later if it lingers. History records 'killed by user'.
  • ENABLE / DISABLEper scheduled job (manual-only jobs have nothing to disable).
  • the master switchSCHEDULE: ON/OFF pauses all cron firing project-wide — job definitions untouched, RUN NOW and KILL still work, a banner states exactly what's paused. For maintenance windows and for teams who use the scheduler purely as a saved-jobs launcher.

Logs — feedback, not dumps

Every job has a LOGSpage: all runs newest-first, each expanding into parsed feedback drawn from dvt's own output markers:

  • the result linePASS / WARN / ERROR / SKIP out of TOTAL, straight from the run.
  • WENT WELLmodels created, seeds loaded, row counts — the green section.
  • WARNINGSeverything dvt warned about, deduplicated.
  • ERRORSthe actual failure messages with their DVT codes — the failing model and the exact reason, not a stack trace hunt.
  • the full raw logone click away; complete logs live in ~/.dvt/logs/jobs/<job>-<timestamp>.log.

What dvt kill does to running jobs

dvt kill stops the scheduler — UI and cron brain together, so nothing fires afterwards. But a job in flight is its own process and dvt kill spares running dvt work by doctrine: your nightly build finishes even if the suite went down halfway through. Its history entry is recorded at start, so nothing vanishes; if the scheduler died mid-run, the next boot marks the entry interrupted — the job process ran on without it (check its log). Only dvt kill --force terminates running work.