Completing a conversation is now a skill the session runs on itself before it ends, instead of a button that resumes it afterwards. A resume is a new process, so it re-creates the whole transcript as fresh input tokens — the same tidy-up costs several times more once the process has exited. The spawn guidelines point the session at `.claude/skills/complete/SKILL.md` after its final notification; that pass waits 30s (a window to redirect after reading the result), publishes the summary via conv-scaffold + one subagent, tidies up, and signs off with COMPLETED. With the prompts living in a skill, the whole CTA layer goes: - backend: ctas.py, /api/ctas* (+ /run, /prompt, /reorder), the seeded prompt writer, the Cta* schemas, meta.ctas and its merge path. /api/claude-hooks stays — it just no longer lives in a CTA-shaped section. - frontend: Settings -> CTAs page, the CTA buttons under a finished thread, the CTA badge, ctaIcons, the cta:<id> composer tags, and the ctas SSE event. - the native Claude Code hooks list moves onto the main Settings page (/settings#hooks), where it is the only hooks surface left. The COMPLETED seal now reads `meta.completedAt`, derived from the transcript's COMPLETED marker the parser already flags, rather than the meta.ctas["complete"] ledger — nothing has to stamp it. What survives of the old pass is unchanged: conv-scaffold, the published summary on meta.summary, and the Summary card (ConversationCtas -> ConversationSummary). Existing meta.ctas data is left alone in the store; it is simply no longer read. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
70 KiB
70 KiB