---
title: "Statement of work and steps"
description: "The plain-language contract on every pipeline, block by block, how to comment on it and commit changes to Jason, and the step diagram behind it."
url: "https://www.jsonify.com/docs/pipelines/statement-of-work"
---

[Documentation](https://www.jsonify.com/docs/) Filter pages

## Getting started

*   [What is Jsonify?](https://www.jsonify.com/docs/)
*   [How pipelines work](https://www.jsonify.com/docs/how-jsonify-works)
*   [Your first pipeline](https://www.jsonify.com/docs/getting-started/first-pipeline)
*   [Workspaces](https://www.jsonify.com/docs/getting-started/workspaces)
*   [Glossary](https://www.jsonify.com/docs/getting-started/glossary)

## Tutorials

*   [Track the Hacker News front page](https://www.jsonify.com/docs/tutorials/hacker-news)
*   [Monitor prices across retailers](https://www.jsonify.com/docs/tutorials/price-monitoring)
*   [Get a Slack alert when a price drops](https://www.jsonify.com/docs/tutorials/slack-price-alert)
*   [Use a dataset from your agent](https://www.jsonify.com/docs/tutorials/agent-query)

## Jason

*   [Chatting with Jason](https://www.jsonify.com/docs/jason/chat)
*   [Changing a pipeline](https://www.jsonify.com/docs/jason/changing-a-pipeline)
*   [Agents, workers and repairs](https://www.jsonify.com/docs/data-agents)

## Pipelines

*   [The pipeline page](https://www.jsonify.com/docs/pipelines/overview)
*   [Statement of work and steps](https://www.jsonify.com/docs/pipelines/statement-of-work)
*   [Inputs and parameters](https://www.jsonify.com/docs/pipelines/inputs)
*   [Settings reference](https://www.jsonify.com/docs/pipelines/settings)
*   [Versions and changelog](https://www.jsonify.com/docs/pipelines/versions)

## Runs

*   [Running a pipeline](https://www.jsonify.com/docs/runs/running)
*   [Scheduling](https://www.jsonify.com/docs/runs/scheduling)
*   [Run detail](https://www.jsonify.com/docs/runs/run-detail)
*   [Run lifecycle](https://www.jsonify.com/docs/runs/lifecycle)
*   [Verification and repair](https://www.jsonify.com/docs/runs/verification-and-repair)

## Datasets

*   [Dataset pages](https://www.jsonify.com/docs/datasets/overview)
*   [Versions](https://www.jsonify.com/docs/datasets/versions)
*   [Query and export](https://www.jsonify.com/docs/datasets/query-and-export)
*   [Row detail and provenance](https://www.jsonify.com/docs/datasets/provenance)
*   [Sharing](https://www.jsonify.com/docs/datasets/sharing)

## Analytics

*   [Dashboards](https://www.jsonify.com/docs/analytics/dashboards)
*   [Newsletters](https://www.jsonify.com/docs/analytics/newsletters)

## Alerts

*   [Alert rules](https://www.jsonify.com/docs/alerts/rules)
*   [Alert history and notifications](https://www.jsonify.com/docs/alerts/history)

## Integrations

*   [Integrations overview](https://www.jsonify.com/docs/integrations/overview)
*   [Slack and email](https://www.jsonify.com/docs/integrations/slack-and-email)
*   [Sheets, warehouses and webhooks](https://www.jsonify.com/docs/integrations/destinations)
*   [Ingest and serve API](https://www.jsonify.com/docs/integrations/api)
*   [Connect your agent (MCP)](https://www.jsonify.com/docs/integrations/mcp)
*   [Command line](https://www.jsonify.com/docs/integrations/cli)

## Workspace and account

*   [Workspace settings](https://www.jsonify.com/docs/workspace/settings)
*   [Team](https://www.jsonify.com/docs/workspace/team)
*   [Billing and usage](https://www.jsonify.com/docs/workspace/billing)
*   [Data retention](https://www.jsonify.com/docs/workspace/data-retention)

## Plans

*   [Radar or Benchmark? Enterprise](https://www.jsonify.com/docs/radar-vs-benchmark)
*   [Row pricing and managed service](https://www.jsonify.com/docs/pricing-model)

## More

*   [Connect your agent](https://www.jsonify.com/connect)
*   [Pricing](https://www.jsonify.com/pricing)
*   [Contact support](https://www.jsonify.com/contact)

[Docs](https://www.jsonify.com/docs/)/Pipelines

# Statement of work and steps

The plain-language contract on every pipeline, block by block, how to comment on it and commit changes to Jason, and the step diagram behind it.

Every pipeline carries a **Statement of Work**: a document that says what the pipeline collects, what it leaves out, the parameters it exposes, what it produces, and the rules it follows while doing so. Jason writes it when the pipeline is built and rewrites it with every version. It is the first thing to read when a pipeline is new to you, and the place to ask for changes.

Open a pipeline, choose **How it works**, then **Statement of Work** in the rail.

1.  **Read**the statement of work
2.  **Select text**any rule, field or step
3.  **Comment**describe the change
4.  **Commit**send the batch to Jason
5.  **New version**reviewed, then active

A change request starts as a comment on the document and ends as a new pipeline version.

## The document

![The Statement of Work for Price and promotion tracking with the cover, objective, scope and the Produces cards](/assets/images/product/pipelines-sow.png)

The statement of work. Each block is anchored, so comments and changelog entries can point at it.

### Cover

The top of the document carries the eyebrow **Statement of work** and **Last updated on** a date. Beside the objective sits a delivery card:

*   **Last successful delivery.** A link to the most recent run that published, with `<rows> rows · <pages> pages · <duration> · <ago>` and a small sparkline of recent deliveries. Under it, a preview of the first rows of the result dataset and **View collection run**.
*   **No successful delivery has been recorded yet.** Shown until the first publish.

### Objective

One paragraph stating what the pipeline is for, written for someone who has never seen the sources. It is the sentence the reviewer checks candidate versions against.

### Pipeline Scope

Two labelled paragraphs:

*   **In scope.** What a row is, which sources and markets are covered, and the fields that are collected.
*   **Not included.** What the pipeline deliberately does not do: pages it does not read, fields it does not keep, markets it ignores.

> “Not included” is explicit on purpose. If you want something the scope excludes, that is a change request, not an assumption the pipeline will make. Comment on the line and commit it.

### Parameters

A strip of chips, one per parameter the pipeline exposes: `region = GB`, `max_products = 500`, `since = yesterday`. Hover a chip for its description, type and whether it is required. The strip is absent when the pipeline has no parameters. Changing a default or a per-run value happens on the Inputs page or in the run dialog; see [Inputs and parameters](https://www.jsonify.com/docs/pipelines/inputs).

### Produces

One card per output. Each card names the output and the dataset it publishes to, describes the rows, and lists every field as a typed chip (`retailer · text`, `price · number`, `observed_at · datetime`). Long field lists collapse behind **View all**.

Under the card, its **guarantees**: promises about the data that the rules below enforce, each citing the rule that backs it.

> Every row has a `price` in the retailer’s currency, or `price_missing_reason` set (R4).

Click an output name to open a summary of that output: its dataset, row count, revision, when it last updated, and its declared columns with types and descriptions. **Open dataset** goes to the dataset page. Before the first run the summary reads **No data yet. Run the pipeline to generate output.**

### How does it work?

The rules ledger. A numbered list of the processing behaviour you can rely on, each with a stable id (`R1`, `R2`, …) that stays the same across versions:

> R3 — Promotions are recorded only when the retailer shows both a previous and a current price; badge-only “deals” are ignored.

Rules are extracted from the pipeline at every publish, so the ledger always describes the active version. A rule that changes keeps its id and notes the version it changed in. Rules are the most useful thing to comment on: a comment on `R3` is a precise change request.

### Input Data

The inputs the pipeline reads: a dataset from another pipeline, a value list such as URLs or product identifiers, or a file. Each is shown with a preview of its current values. Editing the values is done on the Inputs page.

### Output data and Output data columns

The **Output Data** section lists each dataset and file the pipeline publishes, with a link to it. **Output data columns** is the full field table for each output: name, type, description. The step diagram’s outputs point at the same tables.

### Schedule

A single line: **Runs every day at 09:00 (Europe/London).** or **Runs only when triggered manually.** Click it to open the schedule editor without leaving the document. The editor’s fields are described in [Settings reference](https://www.jsonify.com/docs/pipelines/settings) and [Scheduling](https://www.jsonify.com/docs/runs/scheduling).

### Sources and How it runs

Below the contract, **Sources** lists the sites that fed the latest output, and **How it runs** shows a compact version of the step diagram (**The active definition, stage by stage.**). Click an output node to open its summary, or **Open full flow** to go to the Steps page.

### When there is no document yet

A pipeline whose document has not been written shows **Generate document**, which asks Jason to write it. Sections that would be empty are hidden; if nothing applies the page reads **Nothing to show here yet.**

## Commenting and committing changes

The statement of work is where you ask for changes with precision. Rather than describing a rule in a chat, select the rule and say what should be different.

1.  **Select the text.** Highlight any part of a rule, guarantee, field row or step paragraph. A floating **Comment to change** button appears.
2.  **Describe the change.** The composer opens anchored to the selection, with the placeholder **Describe the change you want…**. Press **Comment** to save it. The selection is highlighted in the document and a card appears in the right margin.
3.  **Add more if you need to.** Each comment is a separate card. Reply to your own comment with **Reply…**, or remove it with **Dismiss**. Nothing is sent yet.
4.  **Commit.** A sticky bar at the top of the document counts your open comments: **3 pending changes.** Press **Commit (3)**. Every open comment is sent to Jason as one change request scoped to this pipeline, and the chat opens so you can follow the work.
5.  **Review the version.** Jason makes the change, tests it, and sends it for independent review. When it passes, the version chip advances and the document is rewritten. See [Versions and changelog](https://www.jsonify.com/docs/pipelines/versions).

> On R3: also record promotions when the retailer shows a percentage-off badge with the current price, and store the percentage in a new `promo_percent` column.

Comments are visible to everyone in the workspace. Committed comments disappear from the margin once Jason has picked them up; the request lives on in the chat and in the next version’s changelog.

> Comments attach to rules, guarantees, field rows and step descriptions. The cover, the schedule line and the parameters strip are not commentable: change those from **Settings** and **Inputs**, or ask Jason directly with **Edit pipeline**.

## Viewing an older version

The document always shows the version selected in the version chip. When you pick an older one, an amber bar reads **Viewing v1 · current is v2** with **Restore v1** and **Back to current**. The Steps page switches to the same version. Comments are still possible on an older version, but they are committed against the current one.

## Pipeline Steps

**Pipeline Steps** in the rail shows the pipeline as a diagram: inputs on the left, steps in the middle, outputs on the right. It is the same picture that animates on a live run, drawn here without run data so you can read the structure.

![The Pipeline Steps canvas with input, step and output blocks, and the reading panel on the right showing the selected step](/assets/images/product/pipelines-steps.png)

The step diagram. Select any block to read what it does in the panel on the right.

### Blocks

| Block | Shape | What it is |
| --- | --- | --- |
| Input | Dashed edge into the first step | A dataset the pipeline reads, or a value list such as URLs. Static values show their current value under the name. |
| Step | Rounded box | One stage: fetch a set of pages, extract fields, process rows. A map step repeats its work for every input row; the diagram labels its input edge with the row count. |
| Route | Diamond | A decision that sends rows down one of several branches. |
| Output | Box with a table icon | A dataset or file the pipeline publishes. Click it to open the output summary. |

### The reading panel

Selecting a block fills the panel on the right. Depending on the block you see **Stages** and **Steps** (the position in the pipeline), **Reads inputs** and **Read by** (what flows in and out), **Saves** (the outputs a step writes), **Parameters read in this stage** (or **This step reads no run parameters.**), **Primary key**, and **Last run** facts such as the rows it produced. Buttons take you onwards: **Open inputs** to the Inputs page, **Open output** or **Open dataset** to the output.

Escape or the **×** in the panel clears the selection. **Zoom in** and **Zoom out** sit in the corner of the canvas.

A version without a diagram shows **No diagram available for this version.** and the rail entry is hidden.

> A pipeline built from a brief like “track prices across three retailers” typically shows one input (the product list), three parallel fetch-and-extract steps (one per retailer), a matching step that joins them, a check step, and one output. Selecting the matching step tells you which key it joins on and which rules apply.

## What’s next

[**Inputs and parameters**

Change what the pipeline reads and the defaults it runs with.

](https://www.jsonify.com/docs/pipelines/inputs)[**Versions and changelog**

Every version, why it was created, and how to restore one.

](https://www.jsonify.com/docs/pipelines/versions)[**Changing a pipeline**

Ask Jason in chat when a comment is not enough.

](https://www.jsonify.com/docs/jason/changing-a-pipeline)

[PreviousThe pipeline page](https://www.jsonify.com/docs/pipelines/overview) [NextInputs and parameters](https://www.jsonify.com/docs/pipelines/inputs)

Something missing or wrong? [Tell us](https://www.jsonify.com/contact).[Build it →](https://factory.jsonify.com/setup)

## On this page
