> ## Documentation Index
> Fetch the complete documentation index at: https://docs.frayme.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Save, validate, activate

> The lifecycle contract, the validation banner, node badges and the violation strip, and how to fix common problems.

export const Clip = ({id, caption}) => <Frame caption={caption}>
    <video controls muted playsInline preload="metadata" className="w-full aspect-video rounded-xl" poster={`/videos/guides/${id}.poster.png`} src={`/videos/guides/${id}.mp4`} />
  </Frame>;

export const Shot = ({id, alt, caption}) => <Frame caption={caption}>
    <img className="block dark:hidden rounded-lg" src={`/images/guides/${id}.light.png`} alt={alt} loading="lazy" decoding="async" />
    <img className="hidden dark:block rounded-lg" src={`/images/guides/${id}.dark.png`} alt={alt} loading="lazy" decoding="async" />
  </Frame>;

<Clip id="engineer/validate-fix-activate" caption="Validate an incomplete flow, jump to the problem, then validate and activate a complete one." />

## Save never validates

**Save** stores the head as it is. On a draft it saves in place; on an active version it forks a new draft (**Edits to the active workflow created a new draft**). Nothing live changes until you activate.

## Validate

**Validate** runs the engine's checks without saving. **Workflow is valid** means it can be activated. Otherwise a banner lists the problems.

<Shot id="engineer/valid-04-validate-success" alt="Workflow is valid toast" caption="Ready to activate." />

## Activate is the gate

**Activate** saves any edits, validates, asks **Activate workflow?** and then promotes the version. When blocking problems remain it refuses with **Can't activate yet** and the edits stay as a draft.

<Shot id="engineer/valid-05-activate-confirm" alt="Activate workflow dialog" caption="Confirm before going live." />

<Shot id="engineer/valid-06-cant-activate-toast" alt="Can't activate yet toast" caption="Blocking problems stop activation." />

## Read the banner

The banner over the canvas is red for blocking problems (**Workflow can't be activated — n issues to fix**) and amber for advisories (**Ready to activate — n warnings**). Each line is clickable and centres the node it concerns. Advisories never block.

<Shot id="engineer/valid-01-banner-blocking" alt="Blocking validation banner" caption="A flow whose Review outcomes never reach a decision." />

## Node badges and the violation strip

Nodes with problems get a red ring (blocking) or an amber ring (advisory), with a count when there is more than one. Selecting the node shows the strip **n problems to fix here** at the top of its panel; clicking a finding scrolls to the field.

<Shot id="engineer/valid-03-node-badges" alt="Badged nodes on the canvas" caption="Badged nodes." />

<Shot id="engineer/node-24-violation-strip" alt="Violation strip in the node panel" caption="Field-level findings." />

## Common violations and fixes

| Message                                                                              | Fix                                                                                          |
| ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
| A Review outcome (**approve**, **deny**, **timeout** or a custom action) has no edge | Wire every outcome handle to a node that reaches Approve or Deny                             |
| A path never reaches a terminal                                                      | Add Approve / Deny (or Output in a callable) and connect the branch                          |
| **review queue "x" ... does not exist**                                              | Create the queue in **Settings → Queues** or pick another in the Review node                 |
| **webhook config "x" does not exist**                                                | Create it in **Settings → API → Webhooks** or change **Result webhook** / **Webhook notify** |
| **communication template ... does not exist**                                        | Create it in **Settings → Communication** or change the Send RFI node                        |
| A value referenced as `vars.x` is never produced                                     | Point the expression at an output an upstream node writes                                    |
