A suggested task is a follow-up that a chat offers when it notices work beyond the current one. The offer waits, and nothing starts by itself. This page is the developer reference for the tool behind an offer, suggest_task, and for the service that records offers and turns one of them into a new chat. For what you see and do with a suggestion in the app, see Suggested tasks.
suggest_task offers a single out-of-scope follow-up. Its description reads: Offer one out-of-scope follow-up the user can start in a new chat; never for work you can do now.| Field | How the field is described | Limit |
|---|---|---|
title | Imperative title, at most 60 characters. | 60 characters |
tldr | Why it is worth doing, at most 240 characters. | 240 characters |
brief | Self-contained instructions for the new chat, at most 4000 characters. | 4000 characters |
Suggested "<title>". The user decides whether to start it; do not start it yourself.Only the top-level chat may offer a suggestion. A helper's call is refused with suggest_task is only for the top-level agent; report the follow-up in your result instead. A forked helper still sees the tool, but the call is refused when it runs.
The other refusals name their reason:
| Situation | The refusal |
|---|---|
| The chat runs in a scheduled task's folder | suggest_task: this chat runs in a scheduled task folder, where no new chat can start; offer no suggestions here |
| Ten offers already made in this chat | suggest_task: this chat already offered 10 suggestions; offer no more |
| Three offers already waiting | suggest_task: 3 suggestions already wait for the user; offer no more until one is started or dismissed |
| A second offer in one turn | suggest_task: one suggestion per turn; this turn already offered one |
| No open turn to attach the offer to | suggest_task: requires an open model turn |
| The call has no chat behind it | suggest_task requires an owning agent session |
| A field is empty | suggest_task: <field> must not be empty |
| A field is over its limit | suggest_task: <field> must be at most <limit> characters (got <n>) |
task-suggestion/ not-open.task-suggestion/ open-limit.| Code | The answer | What it carries |
|---|---|---|
task-suggestion/ | no suggestion "<id>" | the id that was asked for |
task-suggestion/ | suggestion "<id>" is <outcome> | the outcome it already has |
task-suggestion/ | 3 suggestions are already open | the limit |
task-suggestion/ | session "<id>" belongs to no workspace or session "<id>" runs in a scheduled task's folder | the chat id |
A title is at most 60 characters, a tldr at most 240, and a brief at most 4000. All three are trimmed, and none may be empty.
At most one per turn, three waiting at a time and ten in a chat's lifetime. The three-open ceiling also applies when a dismissed suggestion is restored.
No. Such a chat refuses with suggest_task: this chat runs in a scheduled task folder, where no new chat can start; offer no suggestions here, because a new chat cannot start there. See Scheduled tasks.
No. Only the top-level chat may offer one; a helper's call is refused with suggest_task is only for the top-level agent; report the follow-up in your result instead. A forked helper still sees the tool, but the call is refused when it runs.
The result reads Suggested "<title>". The offer itself waits in the chat.
Yes. Offers and settlements are durable records on the chat's session log, and the suggestion list is rebuilt from the log when the chat comes back.
The second call returns the same chat. Start is single-flight for one chat and one suggestion, so even two concurrent calls create one chat.
The offering chat's preset, model and permission. When no preset applies, the sandbox and approval settings are copied from the offering chat instead. A started chat never runs with more permission than the chat that offered it.
No. The brief is attributed to the suggestion rather than to a person, and checks that need a person's own instruction do not accept it; the started chat has to ask first.
It stays dismissed and receives no brief. Starting it again fails with task-suggestion/.
Each code carries the detail the caller needs: task-suggestion/ names the id, task-suggestion/ names the outcome the suggestion already has, task-suggestion/ carries the limit, and task-suggestion/ names the chat.