A free-tier user is offered sign-in 3 minutes after their first finished
task, whether or not they send another prompt. Later offers each need
another finished task after the previous one, come 3 minutes after that
task, and never sooner than 1h, 4h, then 24h after the previous offer, so
a user who keeps saying "Not now" hears it less often.
- hermes_cli/free_tier_offer.py: the policy. One install-wide record
(<default root>/free_tier/sign_in_offer.json, file lock + atomic write);
claim_offer() is compare-and-set so two windows never both show it.
Nothing is due off the free tier.
- tui_gateway/free_tier_task_done.py: a "finished task" is a completed
turn with a reply, on the free-tier agent, not a crash resume, and with
no steer/redirect/interrupt/busy-typing while it ran. Called from
prompt_turn after a complete turn, before message.complete goes out, so
a status read prompted by that event already sees the record. Intervention is reported by the agent
(result["user_intervened"], reset per turn) and marked on the session by
the steer/redirect/interrupt RPCs and busy submits.
- Wire: free_tier.status gains nudge_due_in (seconds, 0 = now, absent when
none is pending); new free_tier.claim_nudge -> {claimed}.