A hook resumed every finished run on a timer — unasked-for, and expensive: a
`--resume` never hits the finished run's prompt cache, so each firing re-created
the whole transcript as fresh input tokens. The prompts stay, the scheduler goes.
A CTA is a prompt file plus a button under the last message of a finished
conversation: click loads its prompt into the resume box (editable before it is
sent), long-press fires it at the session in the background. The same prompts are
selectable as `cta:<id>` tags in every composer.
The seeded `complete` CTA also does the post-processing the hook never could
afford: `conv-scaffold` reduces the conversation to markdown — metadata, its
prompts, merged bash/tool/subagent summaries, one squashed diff across every
commit it produced — and one subagent fills in the Summary/Analysis and publishes
it onto `meta.summary`, rendered under the thread.
- backend: ctas.py (store + seeded Complete), scaffold.py (+ /scaffold, PUT
/summary), /api/ctas CRUD/run/prompt/reorder; hooks.py and its scheduler,
pending queue and routes deleted (read-only /api/claude-hooks stays)
- frontend: ConversationCtas section, Settings → CTAs, cta tags, CtaBadge
- scripts/conv-scaffold.sh: scaffold + publish CLI
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>