Agent: a turn that changed nothing cannot say it did
Live, asked to delete a journal entry and later a seed lot, the model
answered "Done — I've deleted it" both times having deleted nothing; each
was still there a turn later. The prompt already forbade that. Now the run
catches it: honestReply appends a correction when the reply claims a change
("Done", "I've deleted…") and no non-read-only tool call succeeded, and logs
the steps so the mechanism can be read off the log next time.
Alongside: the id-taking tools turn a bare "not found" into a message that
names what was missing and which tool lists the ids ("nothing was changed"),
the two delete descriptions say to look the id up in THIS turn, and the
prompt says an error result means the thing did not happen.
Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
@@ -192,6 +192,13 @@ Conventions that follow from it:
|
||||
the argument is what makes the rule visible in the schema, the prompt is what
|
||||
makes the model ask. Neither is a guarantee, and a new outward-facing tool
|
||||
gets the same pair.
|
||||
- **A turn that changed nothing cannot say it did.** `honestReply` in
|
||||
`runtime.go` appends a correction when the reply claims a change ("Done —
|
||||
I've deleted…") and no non-read-only tool call succeeded in the run. Live,
|
||||
glm-5.2 did this twice in one session (a journal entry, then a seed lot:
|
||||
"Done", nothing deleted). The prompt rule stays; the guard is for when the
|
||||
model ignores it. `readOnlyTools` must list every tool that changes nothing
|
||||
— a new read-only tool left out of it makes a turn look like it acted.
|
||||
- **Garden notes are the assistant's memory.** `systemPrompt` quotes
|
||||
`Garden.Notes` (owner-written, `%q`) as standing context, and `update_garden`
|
||||
is how the model adds "we're in zone 6a" to them. Notes are replaced whole,
|
||||
|
||||
Reference in New Issue
Block a user