State machine
Conversation sub-states
WithinACTIVE, the conversation moves through:
GREETING— agent sends opening message from briefAWAITING_RESPONSE— waiting for user replyPROBING(conditional) — agent sends follow-up if response was thin; returns toAWAITING_RESPONSECLOSING— agent sends final turn; transcript queued for Kimi
Timing
| Stage | Target |
|---|---|
| Join detected → DM sent | < 2s |
| Each LLM turn | < 1s |
| Kimi scoring | < 3s |
logCompletion contract call | < 5s |
releasePayout contract call | < 5s |
| User admitted | < 1s after payout confirmed |
Timeouts
Verification timeout: User does not respond to the initial DM within 5 minutes →TIMED_OUT → user denied. They can rejoin and start a new verification.
Rejection cooldown: Two consecutive failures (including re-prompt) → COOLDOWN_REJECTED → 24-hour cooldown on that user/group combination. The cooldown key is tg_user_id + group_id.
Kimi outage: Scoring request queued with up to 4 retries and exponential backoff. If all 4 fail → SCORING_UNAVAILABLE → user admitted, no payout released, no cooldown applied. Kimi infrastructure failures do not penalize users.
Rate limits
| Scope | Limit |
|---|---|
| Per user per group | 3 verification attempts per 24 hours |
| Per group globally | Sequential processing (no concurrent verifications per group) |
Re-prompt
On first failure, the agent sends a single re-prompt using a different angle from the same brief:“Let’s give it another shot — [rephrased question or different question from the brief].”If the second attempt also fails, the user is denied and the 24-hour cooldown begins. Failed verifications are not billed to the advertiser.