diff --git a/docs/ai-chat/changelog.mdx b/docs/ai-chat/changelog.mdx
index 52fed7c214..c4c90061b8 100644
--- a/docs/ai-chat/changelog.mdx
+++ b/docs/ai-chat/changelog.mdx
@@ -4,6 +4,81 @@ sidebarTitle: "Changelog"
description: "Pre-release updates for AI chat agents."
---
+
+
+## chat.headStart now works for custom agents and sessions
+
+[Head Start](/ai-chat/fast-starts#head-start) — running the first `streamText` step in your warm server while the agent boots in parallel — now works with the `chat.customAgent` and `chat.createSession` backends, not just the managed `chat.agent`. The warm step-1 response hands over to your loop the same way it does for a managed agent. ([#3963](https://github.com/triggerdotdev/trigger.dev/pull/3963))
+
+In a `chat.customAgent` loop, consume the handover on turn 0:
+
+```ts
+const conversation = new chat.MessageAccumulator();
+const { isFinal, skipped } = await conversation.consumeHandover({ payload });
+if (skipped) return; // warm handler aborted, so exit without a turn
+if (isFinal) {
+ await chat.writeTurnComplete(); // step 1 is the response, no streamText
+} else {
+ const result = streamText({ model, messages: conversation.modelMessages, tools });
+ // Pass originalMessages so the handed-over tool round merges into the
+ // step-1 assistant instead of starting a new message.
+ const response = await chat.pipeAndCapture(result, {
+ originalMessages: conversation.uiMessages,
+ });
+ if (response) await conversation.addResponse(response);
+}
+```
+
+With `chat.createSession`, the iterator surfaces it as `turn.handover`; call `turn.complete()` with no argument on a final handover. The lower-level `chat.waitForHandover()` and `accumulator.applyHandover()` are also exported for hand-rolled loops. See [Handover with custom agents](/ai-chat/fast-starts#handover-with-custom-agents).
+
+## Cache your system prompt with Anthropic prompt caching
+
+`chat.toStreamTextOptions()` can now emit the system prompt as a cacheable message when you opt in, so a large, stable system block is billed at cache-read rates on every turn instead of full price. Without an option, `system` stays a plain string. ([#3952](https://github.com/triggerdotdev/trigger.dev/pull/3952))
+
+```ts
+// at the streamText call site (Anthropic sugar)
+streamText({
+ ...chat.toStreamTextOptions({ cacheControl: { type: "ephemeral" } }),
+ messages,
+});
+
+// provider-agnostic equivalent
+chat.toStreamTextOptions({
+ systemProviderOptions: { anthropic: { cacheControl: { type: "ephemeral" } } },
+});
+
+// or where the prompt is defined
+chat.prompt.set(SYSTEM_PROMPT, {
+ providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } } },
+});
+```
+
+Pairs with a `prepareMessages` cache breakpoint to cache the conversation prefix across turns too. See the [Prompt caching](/ai-chat/prompt-caching) guide.
+
+## Custom agent loop fixes
+
+Three fixes for custom agent loops (`chat.customAgent`, `chat.createSession`, and hand-rolled `MessageAccumulator` loops): ([#3936](https://github.com/triggerdotdev/trigger.dev/pull/3936))
+
+- **Continuations no longer replay answered messages.** The `.in` resume cursor is now seeded before any listener attaches (the same boot logic `chat.agent` uses), so a chat that continues after a cancel, crash, or upgrade only sees genuinely new messages.
+- **Steering mid-stream keeps the in-flight response.** `chat.pipeAndCapture` now stamps a server-generated message id on the stream, so a `prepareStep` injection keeps the partial text instead of replacing the message.
+- **Task-backed tools work from custom loops.** `ai.toolExecute` now threads the parent's session to the child run, so child tasks can stream progress into the chat with `chat.stream.writer({ target: "root" })` instead of failing with "session handle is not initialized".
+
+See [Custom agents](/ai-chat/custom-agents).
+
+## trigger skills: namespacing, docs bundling, and a cost-savings skill
+
+Follow-ups to the [`trigger skills`](/ai-chat/patterns/skills) command shipped in rc.6:
+
+- The skills installed into your coding assistant are now namespaced with a `trigger-` prefix (e.g. `trigger-authoring-tasks`, `trigger-getting-started`) so they don't collide with unrelated skills in your skills directory. ([#3970](https://github.com/triggerdotdev/trigger.dev/pull/3970))
+- `@trigger.dev/sdk` now bundles the Trigger.dev agent skills and the full Trigger.dev documentation those skills reference. The installed skills read this content from `node_modules`, so the guidance your AI assistant follows is pinned to the SDK version in your project and stays current across upgrades instead of going stale until the next reinstall. ([#3937](https://github.com/triggerdotdev/trigger.dev/pull/3937), [#3970](https://github.com/triggerdotdev/trigger.dev/pull/3970))
+- New `trigger-cost-savings` skill for auditing and reducing compute spend — right-sizing machines, `maxDuration`, batching, and debounce. ([#3970](https://github.com/triggerdotdev/trigger.dev/pull/3970))
+
+```bash
+npx trigger.dev@4.5.0-rc.7 skills
+```
+
+
+
## chat.agent reliability fixes