# Configure a workflow


Open an existing Campaign and choose **Open builder**. Select a node on the canvas to open its configuration panel; set its inputs and outgoing path, select **Save** in the panel, then **Save** on the canvas toolbar. Reopen the node to confirm its values and connections.

For a small illustrative labeling task, trace one record through **Entry Gate → Supply (label) → Accept → Sink**. The Gate checks who may join; Supply shows the record and collects a label; Accept decides whether the result is accepted; Sink ends the accepted path. Add `validate`, Consensus, Dedup, ETL, or an Agent Task only when the work needs that check or transformation. A connected path still needs a form, acceptance rule, and [launch checks](/tasks/launch) before it can run.

## Entry Gate

Set any applicable agreement, required course, profile condition, and Campaign invitation code. Platform **System required** agreements follow the Contributor's applicable subject and are not author-removable; optional agreements must have a published version in the directory. If a selected agreement cannot be resolved, correct its directory binding instead of clearing a necessary term.

A required course points to a published organization course and version. **Has finished the course** accepts a passed or mastered result; **Has mastered the course** requires mastered. Completing a course records a passed result and nothing in the course editor produces a mastered one, so a Gate set to **Has mastered the course** currently admits no one; select **Has finished the course**. [Bind the course to a Campaign](/learning/authoring#bind-the-course-to-a-campaign) covers the three course fields. **No courses published yet**, a missing version, or a failed course load calls for publishing or restoring the right course/version first. The [course guide](/learning/learning) explains historical results.

A Campaign code is distinct from a registration referral code or organization invitation. **Generate**, **Copy**, **Regenerate**, and **Revoke** take effect immediately rather than waiting for the canvas save. Changing the code does not independently remove access already redeemed; someone who leaves and rejoins must meet the entry conditions again.

## Supply: human work and capacity

Choose a [Task type](/tasks/task-types), configure the work interface, pay, and quotas. A normal human step can pay a base amount per accepted submission. A person's quota can be **No limit**, **Per day**, or **In total**; the daily limit resets at 00:00 UTC. **Items to collect** caps the total supply: in-progress and under-review work occupies capacity, while rejected or duplicate outcomes release their places.

Do not rely on **Concurrent tasks per user** as an enforced limit; the platform does not enforce it yet.

## Validate, Consensus, and Dedup

Ordinary `validate` reviews a selected earlier human step. Set one to five reviewers, with an agreement threshold no greater than the maximum. Reaching agreement can resolve the review, including agreement to reject. It does not require a second Consensus node. For ordinary `validate`, use **Auto** in Accept. A reward labeled **per item, shared by whoever agreed** is one pool distributed among eligible agreeing reviewers, not the full amount for each person.

**Consensus** compares multiple answers to the same object. Select the earlier step, maximum answers, agreement threshold, and fields that must match. With no fields selected, it compares the entire answer, including free text; choose fields deliberately when only a category must agree. It is different from checking one preceding submission.

For **Dedup**, select **Key fields** and comparison scope for each rule. All fields in one rule must match; a match on any configured rule can mark a duplicate. Organization-wide comparison across Campaigns needs a consistent **Canonical key**. Where the deployed rule offers **Send the duplicate to publisher review**, enabling it keeps a match pending until a publisher decides. With the option off, a match can be marked Duplicate automatically. An automatic matching rule takes precedence if both apply.

An **Agent Task** requires an Agent already wired into the organization, Campaign-specific instructions, and the checks or score threshold you intend to use. A node name alone does not invoke an Agent. [Agent access](/api/agent-access) describes the separate data-access boundary; it is not a substitute for wiring a workflow Agent.

## Accept and deliver

| Audit mode | Supply before work arrives | What to inspect after arrival |
| --- | --- | --- |
| Auto | Put the needed validation or consensus on the preceding path | Uses those results; it does not create a missing review |
| Manual | Set the minimum rating and arrange an authorized reviewer | Stays in review until the reviewer decides; check **Reviews** |
| Automated checks | Choose input fields, check method or Agent, failure handling, and rating threshold | Inspect each check and the resulting grade |
| Scripted | Select an existing **Acceptance check**, or **Write a check**, with a rating threshold | An absent check fails rather than silently accepting |

If you require a minimum acceptance grade, select a value from 1 to 5. An existing manual submission keeps the threshold it started with; editing the threshold does not rewrite past results.

Connect the accepted branch to **Sink**, optionally through **ETL** to map fields. Sink ends the workflow path. Its JSON and CSV settings are not a download button. An accepted result still needs the applicable [delivery, subscription, and authorization conditions](/data/delivery) before an API consumer can read it.

Save the workflow, then open **2 Test & Launch** for the [release checks](/tasks/launch).

## Other nodes, and why some are greyed

| Node | Use it to |
| --- | --- |
| **Data Source** | Bring in data that already exists on the platform: a new node opens on **CSV**, so select **Marketplace**. Nothing reads **CSV**, **File batch** or **Webhook** yet, so their path field is disabled and a saved path brings in no items. To load a CSV, ask [hello@humanbased.ai](mailto:hello@humanbased.ai) |
| **Code** | Run a custom Python transform on each item. Code is no longer in the palette; you see it only on a saved flow that already has a Code step |
| **Routes** | Branch, loop, or sample items |
| **Agent Task** | Run a platform agent check whose verdict routes downstream |

Some palette entries are greyed with a lock, and each one states why and what unlocks it. **Labeling** and **Validate** have no runner of their own: use a **Supply** node and choose the `label` or `validate` task type instead. **Evaluate** has no runner yet and stays locked until one ships. **Transform**, **De-identify**, and **Policy Gate** run, but have not passed internal acceptance, so they stay locked until they do.

## If a check fails

| Symptom | Return to |
| --- | --- |
| Contributor cannot join | **Entry Gate**: agreement, course/version and achievable result, profile rule, or Campaign code |
| Human step has no form | **Supply**: Task type, template binding, and Preview; for ordinary `validate`, its earlier source step |
| Review cannot reach a decision | `validate` or Consensus: source, maximum reviewers, threshold, and comparison fields |
| Work stays in review | **Accept**: mode, waiting reviewer, selected check, and failure result |
| Accepted work has no expected delivery | Accepted branch to **ETL** (if used) and **Sink**; then [delivery and access](/data/delivery) |

After correcting a node, save its panel and the canvas, reopen it to check the saved values, then repeat **Dry-run**. A successful save is not a passed test or a launch.
