Progress

Progress is scoped per flow, user, and optional workspaceKey. Personal and workspace items use separate generation counters.

Pin revision

Mutations include the published revision. Clients pin to the revision they loaded. Publishing a new revision does not retroactively rewrite stored step states.

Dual generations

personalGeneration and workspaceGeneration increment on successful writes. Every mutation sends the generations the client last saw.

409 stale

When generations mismatch, the adapter returns stale (HTTP 409 on Hosted). The widget reloads progress and retries reconciliation.

requestId vs transitions

requestId idempotents reads and writes. AdapterResult.acceptedTransitions lists events that actually changed state. onEvent fires only when changed: true.

Skip semantics

  • Skip then complete is allowed on optional items.
  • Skip after complete does not uncomplete the step.
  • Required items cannot be skipped unless marked optional.
  • If a step was skipped while optional and is later published as required, that stored skip is ignored. The step is incomplete or blocked, counts toward required progress, and can be marked complete.
  • Undo on a skipped optional step deletes that progress row (same skip permission) so the step is incomplete again. It does not uncomplete a complete row. A fact value of true still evaluates as complete.

Related: Completion · Adapter · Facts