Skip to main content
These rules are load bearing. Violating them causes the avatar to hallucinate, loop, double speak, or fail silently. Every rule is the result of real debugging time across real integrations. Treat them as gospel until you understand them deeply enough to bend them.

1. Always author prompts in English; choose Say: vs descriptive by verbatim-control needs

Author every prompt and outcome condition in English — regardless of which languages your deployment supports. The FaceSign runtime translates avatar speech into the resolved session language at runtime; mixing authoring languages across nodes (some in English, some in the target language) causes the avatar to flip languages mid-flow. Within that constraint, the prompt style is a separate choice driven by whether you need verbatim control: Descriptive prompts — the default. The LLM paraphrases at runtime and translates cleanly into any session language. Use for multilingual flows and whenever exact wording doesn’t matter.
Descriptive — paraphrased at runtime, translatable
Say: <exact text> — a verbatim-wording directive. The avatar stays close to the source sentence; the runtime still translates the text into the resolved session language, but the result tends to be stiffer than a fresh paraphrase. Use when wording is non-negotiable (legal disclaimers, brand copy).
Say: — verbatim wording
For multilingual flows, prefer descriptive prompts — they produce more natural target-language output.

2. Never put conditional logic in a single prompt

This is the single most common cause of broken demos. Do not write “If recognized, do X. If not, do Y.” The avatar will ignore the condition, hallucinate, or pick the wrong branch. Instead, use the flow’s structural branching:
Wrong: one node, conditional prompt
Right: separate nodes per path

3. Outcome conditions: "" for unconditional, natural language for branching

Every conversation-node outcome takes one of two forms:
  • Single outcome (unconditional)condition: "". No evaluation happens; the flow moves to the target regardless of what the user says. Use for informational turns that don’t branch — greetings, explanations, closings, and every node with doesNotRequireReply: true.
  • Multi-outcome (conditional) — each branch gets a natural-language condition describing its trigger. Always include an explicit stall or refusal branch so the conversation can’t get stuck.
Single-outcome unconditional
Multi-outcome with explicit fallback

4. doesNotRequireReply: true only on the last node before end

The flag marks a final monologue — the avatar delivers a closing message and the session ends without waiting for a reply. The node must have a single outcome that targets an end node with condition: "". It has no meaning on mid-flow nodes. If you want a mid-flow node that speaks and continues without waiting for a reply, use a single unconditional outcome (condition: "") and leave doesNotRequireReply unset — see Rule 3.

5. One question per node

Do not ask multiple questions in a single conversation node. Outcome conditions will match prematurely after the first answer. Split into separate nodes.
Wrong
Right

6. The greeting must be long enough for video accumulation

Video-analysis nodes (liveness_detection, face_scan, face_compare, recognition) need at least 5 seconds of camera feed before they can run. A conversation node with actual avatar speech must precede the first video-analysis node in the flow to establish that buffer. Once buffered, subsequent video-analysis nodes can run back-to-back without another conversation in between. Short greetings cause the first video-analysis node to fail — for recognition this typically surfaces as newUser even for returning users.
Too short, first video-analysis node may fail
Good, gives the camera time to accumulate video

7. Do not reference invisible steps

liveness_detection, recognition, face_scan, and face_compare run silently in the background. Do not have the avatar say “That’s done!” or “Looking good!” after one of these — the user saw nothing happen, so the acknowledgment breaks the illusion. Skip straight to the next meaningful interaction.

8. Use the full name for recognized users

When greeting recognized users, instruct the avatar to use the full name: “Hey Ada Lovelace” not “Hey Ada”. Add “Use their full name, not just first name.” to the prompt.

9. The avatar does not need to introduce herself

Do not waste time with “I’m your verification assistant.” Go straight into the purpose.

10. Combine the greeting with the first question for recognized users

This removes an awkward extra conversational turn.
Good: one node

11. No self-loops in conversation node outcomes

The flow validator rejects any outcome whose targetNodeId equals its own node’s id. If you need retry-on-unclear-input behavior, fold it into the prompt text rather than using a self-looping outcome:
Rejected by the validator
Accepted

Next Steps

Known Behaviors

Intentional platform behaviors and edge cases to design around.

Verification Patterns

Recognition branching, document scanning, and 2FA flow patterns.

Production Checklist

Pre-release checklist before shipping to production.