Skip to main content

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​

  • web/interview.html
  • supabase/functions/kickoff-intake/index.ts