Screen: Kickoff Interview
web/interview.html, reached via interview.html#t=<token>. This is the stakeholder-facing side
of Kickoff Discovery — the one screen in the entire application a person
with no SABLE account, and no SABLE login, will ever open.
No login, a token instead
The invite token in the URL fragment is the entire authentication model — there is no username,
password, or Supabase session on this page. kickoff-intake
verifies the token by hash lookup, checks expiry/revocation, and enforces a per-interview rate
limit before accepting any answer.
What the stakeholder sees
The project's display name and their own name — nothing else about SABLE, the account, or any other stakeholder's answers. The interview itself is adaptive: it works through five built-in themes (success criteria, pain points, risks/concerns, data/access, scope/priorities) unless a project has configured its own question set, in which case those take priority.
What happens on completion
The full rendered transcript, capped at 60,000 characters, is written as one sources row
(type = 'manual', external_id = 'kickoff:<id>') — the provenance root
interview-synthesize later reads when a
lead runs synthesis back on the Kickoff Discovery screen.
Where the code lives
sable-agents-demo/web/interview.htmlsable-agents-demo/supabase/functions/kickoff-intake/index.ts