Jobs

A chat that owns a git branch.

Jobs are how tvaras ships: dbt models, BI configs, connector code, docs. Start from a message or a ticket, review a plan, watch the diff grow next to the conversation, merge when you are happy. Desktop or phone — same workbench.

tvaras · job · DATA-412 customer_ltv
stg_stripe refundsDATA-412 customer_ltvLightdash explore: ordersfix freshness test+
DATA-412 customer_ltvIn progressDATA-412·In progress working · autopilot on
Goal · 2 / 3verify: dbt build -s dim_customer+
  • customer_ltv net of refunds
  • tests pass
  • explore dimension visible
Edit dim_customer.sqlEdit schema.ymlBash dbt build -s dim_customer+
Build passed — 4 models, 6 tests. customer_ltv is now net of refunds. Adding the Lightdash dimension next.
Round it to 2 decimals in the explore, and label it “Lifetime value”.
Message the job…
Changes3FilesGitChecks dbt build
Mmodels/marts/dim_customer.sqlMmodels/marts/schema.ymlMmodels/marts/_lightdash.yml
models/marts/dim_customer.sql+3−1KeepRevertAsk
12with orders as (
13 select customer_id,
14- sum(gross_revenue) as revenue
15+ sum(net_revenue) as revenue,
16+ sum(case when is_refund then 0
17+ else net_revenue end) as customer_ltv
18 from {{ ref('fct_orders') }}
19 group by 1
20)
The idea

Three kinds of conversation. This one ends in a merge.

A chat answers a question. A playground chat builds an app. A job changes your repository — on a dedicated branch and working copy, with a status, a goal and a workbench that shows every edit as it happens. It is still a chat: you talk, it works. But what it produces is a reviewable, shippable change, not a paragraph.

  • Own branch, own worktree. Nothing touches your base branch until you approve. Protected paths stay protected.
  • Goal-first. Your first message becomes the goal; the assistant proposes acceptance criteria and a verify command.
  • Needs-you, not babysitting. Autopilot works between your messages. When it needs a decision, you get a notification — on desktop or phone.
How a job is created

From a ticket to a reviewed change, in four screens.

The example below starts from a Linear task. A job started from a plain message skips straight to the plan.

  1. 1Start from a task

    Pick a task. The tracker is updated for you.

    New Chat ▸ Job from a task opens the picker. Paste a URL or key, or search by title — Linear, ClickUp and Jira work the same way. Press Start job: the task is moved to your team's "in progress" status (whatever it is called — Doing, In Dev, WIP; the wrapper understands statuses by meaning) and a comment links back to the job.

    tvaras · Start a job from a task
    Start a job from a task
    LinearClickUpJira
    customer_ltvpaste a URL or key
    DATA-412Todo

    Add customer_ltv to dim_customer

    DATA-409Todo

    Refund events missing from stg_stripe

    DATA-401Backlog

    Weekly churn report → Slack

    DATA-412·TodoJ. Reyes

    Add customer_ltv to dim_customer

    Finance wants lifetime value per customer in the BI explore. Sum of net revenue from fct_orders, refunds excluded. Add a test.

    Recent comments

    “Net of refunds, please — same as the finance sheet.” — M. Kaur

    Start jobOpen existing job→ moves to In progress
  2. 2Review the plan

    It investigates first and proposes a plan. Nothing changes yet.

    The assistant reads the task, explores the repository and proposes a goal statement, acceptance criteria, an optional verify command and a short approach — as a card in the chat. Accept it, edit the goal or criteria first, or ask for changes with a comment. Accepted plans become the job's goal and the work starts.

    tvaras · job · DATA-412 customer_ltv
    stg_stripe refundsDATA-412 customer_ltv+
    Started from Linear DATA-412
    job_task_getRead models/marts/dim_customer.sqlGrep net_revenuejob_plan_propose
    Plan proposed — your review
    Goal

    Expose customer_ltv (net of refunds) on dim_customer and in the Lightdash explore.

    Acceptance criteria
    • dim_customer.customer_ltv = Σ net_revenue from fct_orders, refunds excluded
    • not_null + non-negative tests pass
    • Lightdash dimension customer_ltv visible in the Customers explore
    Verify command

    dbt build -s dim_customer+

    Approach

    Add CTE in dim_customer.sql · schema.yml tests · lightdash meta · run build

    Accept planAccept with editsAsk for changes
  3. 3Watch the work

    Every edit lands in the workbench as it happens.

    Changes shows every file that differs from the base branch with a real diff — keep or revert individual hunks, or ask about one (the location rides along with your message). Checks runs the repository's configured commands: dbt build, tests, lint. Criteria get ticked as they are met; autopilot continues until all of them are, within the cycle and cost budget you set.

    tvaras · job · DATA-412 customer_ltv
    stg_stripe refundsDATA-412 customer_ltvLightdash explore: ordersfix freshness test+
    DATA-412 customer_ltvIn progressDATA-412·In progress working · autopilot on
    Goal · 2 / 3verify: dbt build -s dim_customer+
    • customer_ltv net of refunds
    • tests pass
    • explore dimension visible
    Edit dim_customer.sqlEdit schema.ymlBash dbt build -s dim_customer+
    Build passed — 4 models, 6 tests. customer_ltv is now net of refunds. Adding the Lightdash dimension next.
    Round it to 2 decimals in the explore, and label it “Lifetime value”.
    Message the job…
    Changes3FilesGitChecks dbt build
    Mmodels/marts/dim_customer.sqlMmodels/marts/schema.ymlMmodels/marts/_lightdash.yml
    models/marts/dim_customer.sql+3−1KeepRevertAsk
    12with orders as (
    13 select customer_id,
    14- sum(gross_revenue) as revenue
    15+ sum(net_revenue) as revenue,
    16+ sum(case when is_refund then 0
    17+ else net_revenue end) as customer_ltv
    18 from {{ ref('fct_orders') }}
    19 group by 1
    20)
  4. 4Review & ship

    Approve, merge — or open a pull request.

    Move the job to In review (or let it happen when the goal is met). The workbench freezes a snapshot: files, commits, check results, goal progress. Approve to merge into the base branch, or open a PR if the repository is set up that way; request changes and they go straight to the assistant. The linked task follows: review → "QA", done → "Done".

    tvaras · job · DATA-412 customer_ltv · review
    In review· snapshot frozen · goal 3 / 3 Approve & mergeOpen a pull requestRequest changes
    Files · 3
    • models/marts/dim_customer.sql +3 −1
    • models/marts/schema.yml +9
    • models/marts/_lightdash.yml +4
    Commits · 2
    • a41c9e dim_customer: add customer_ltv net of refunds
    • f07b22 lightdash: expose Lifetime value dimension
    Checks
    • dbt build -s dim_customer+ · 41s
    • sqlfluff lint · 3s
    • lightdash validate · 12s
    Linked taskDATA-412·QA→ on approveDATA-412·Donesquash → main
The workbench

Four panels next to the chat.

01

Changes

Every file that differs from the base branch, with a real diff. Keep or revert hunks. Ask the assistant about a hunk — the diff location is attached to your message.

02

Files

Search and browse the repository, open a file in the editor, save. The assistant sees your edit on its next step.

03

Git

Commit with an AI-drafted message, push, update from the base branch, resolve conflicts, merge or open a pull request.

04

Checks

Run the repository's configured commands — tests, dbt build, lint — and read the log. The assistant can run them too, and the verify command gates the goal.

Many jobs at once

Like terminal tabs, for work that ships.

Open jobs sit in a strip above the conversation. Click a tab, use Alt+←/→ and Alt+1…9 — or swipe on a phone. Each job carries a status (Open, In progress, In review, Done — admins can rename and extend these) and a live runtime indicator: working, idle, needs you, error. Jobs that need you are listed in the Inbox on the board and trigger notifications.

stg_stripe refundsDATA-412 customer_ltvLightdash explore: ordersfix freshness test+

Open

4

In progress

2

Needs you

1

In review

1

On a phone

The same job, one thumb.

Swipe between jobs; the bottom bar switches Chat · Changes · Files · Git. Diff and editor go full-screen, and the editor gets a key bar (tab, undo, brackets, save) above the keyboard. Turn on push notifications from the Jobs board to be told when a job needs you.

See the mobile workbench
9:41
stg_stripeDATA-412orders explore+
DATA-412 customer_ltv working
Goal · 2 / 3autopilot on
  • customer_ltv net of refunds
  • tests pass
  • explore dimension visible
Edit dim_customer.sqlBash dbt build
Build passed — 4 models, 6 tests. customer_ltv is net of refunds. Adding the Lightdash dimension next.
Label it “Lifetime value”, 2 decimals.
Done. Ready for review — move to In review?
Yes, reviewNot yet
Message the job…
ChatChanges3 changedFilesGit
9:41
stg_stripeDATA-412orders explore+
Changes · 3 filesjob/customer-ltv-412
dim_customer.sqlschema.yml_lightdash.yml
models/marts/dim_customer.sql+3−1KeepRevertAsk
12 select customer_id,
13- sum(gross_revenue) as revenue
14+ sum(net_revenue) as revenue,
15+ sum(case when is_refund then 0
16+ else net_revenue end) as customer_ltv
17 from {{ ref('fct_orders') }}
Ask about this hunk

Should refunds older than 12 months count?

dim_customer.sql:14-17Send
ChatChanges3 changedFilesGit
9:41
stg_stripeDATA-412orders explore+
Gitjob/customer-ltv-412
↑ 1 ahead·base: main checks
Staged · 3
  • Mmodels/marts/dim_customer.sql
  • Mmodels/marts/schema.yml
  • Mmodels/marts/_lightdash.yml
Commit message✦ drafted

lightdash: expose Lifetime value dimension on Customers

CommitPushUpdate from mainOpen PR
ChatChanges3 changedFilesGit

Stop hand-carrying tickets into your repo.

Jobs ship with every tvaras instance. Self-hosted, on your LLM.