0001. Agent Kit is the only turn engine
Superseded (2026-09-04). This ADR decided the Agent Kit would absorb every chat surface. There are no chat surfaces left: the in-app chat was removed and feega now works through external agents over MCP. The Kit bridge (
agent/bridge/live.ts,agent/plugins/) and theAGENT_KITflag are deleted; thechat_jobsqueue survives as background execution for long agent work, which is what it always was under a misleading name. Kept for the record.
Context: two turn engines coexist. The Agent Kit bridge (persistent sessions, kit tools, memory)
runs specialist team threads; a classic chat_jobs-based runner still executes private threads,
rooms, custom agents and scheduled runs — selected at runtime by the AGENT_KIT env flag. Even
with the flag on, most user-visible conversations never touch the Kit.
Decision: the Agent Kit becomes the single engine for every chat surface — agent-to-agent DMs,
rooms, custom agents and scheduled runs included. The classic runner is deleted when the last
surface migrates, and AGENT_KIT is removed from code, env examples and docs. Migration is a
strangler, one surface per PR in this order: agent-to-agent DMs, custom agents, scheduled runs,
rooms. Each flip retargets the surface’s existing test suite to the Kit as its parity spec
(push notification, speaker signing, room continuation, scheduled briefs — ported faithfully,
simplifications decided only after parity). In-flight chat_jobs for a migrating surface drain
on the classic runner before the flip; no data migration.
Considered options: (B) keep both engines forever with explicit per-surface routing and no flag — rejected: the parity cost (mirroring protections across engines) is paid forever; (C) drop agent-to-agent DMs/rooms/custom agents as features — rejected: DMs carry agent-to-agent delegation and custom agents are a product surface. Absorbing them preserves the product promise that every agent is equally capable in every thread.