FLT 75 REVIEW ROUND4

The production dependency configuration changes resolved requester identities to random profile IDs that cannot pass the existing allowlist check, preventing intake from accepting valid requests. The completed-idempotency recovery path can also corrupt ticket URL metadata.

Full review comments:

  • [P1] Preserve the allowlisted stable identity — C:\Users\fives\source\repos\founder-intake-wt-c456\FounderIntake.Host\Adapters.cs:31-31 When RequesterDirectory is supplied by Program, this replaces the configured stable ID with a newly generated profile GUID. IntakePipeline.AcceptAsync immediately checks that value against options.AllowedRequesterStableIds, which contains the configured requester IDs, so every otherwise valid Slack and AgentMail event is denied after the first profile resolution. Keep authorization based on map.StableId and carry the profile ID separately for request binding.

  • [P2] Do not overwrite ticket metadata with an empty URL — C:\Users\fives\source\repos\founder-intake-wt-c456\FounderIntake.Host\ConversationResponder.cs:211-214 When an idempotency reservation is already complete but the thread-ticket update did not finish, this reconstructs the ticket using only its key and an empty URL. The shared success path then overwrites thread_tickets with that empty URL and sends a malformed requester reply, while also adding the transcript comment again. Persist and recover the ticket URL with the idempotency result, or use a separate recovery path that does not replace known metadata.