A time in no particular zone, and a preview missing what it previews
The first audit pass: everything from 0.8.1 to 0.9.8 read as a whole rather than one feature at a time, starting with what a model is actually told. Four of these had shipped as correct. The date line carried a timezone variable that resolves to nothing until somebody chooses one -- so every default account was told times were "in unless they say otherwise", while two comments asserted the line disappeared instead. The prompt preview built its variables without a chat, which is what eleven fragments are gated on, so the whole agent surface was absent from it whatever was ticked. Plan mode was instructed to keep its plan current with a tool that mode withdraws. And knowledge_get returned a document whole where every sibling reader caps and says so, its description promising exactly that. The subagent guidance was wrong in both directions at once: it denied a documented parameter and named seven of twenty-three allowed commands. Both halves are pinned by tests against the real list and the real schema now, because prose and a constant drift the moment one is edited alone. docs/notes/audit-0.9.md carries the findings that are not fixed here, with why -- the ones whose fix would change what a feature does are the user's call, not this pass's. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -219,8 +219,14 @@ VARIABLES: tuple[Variable, ...] = (
|
||||
"The current plan",
|
||||
"The plan this agent chat is working to, with its ids, finished phases "
|
||||
"collapsed and the active one shown in full. Empty when there is none, "
|
||||
"which is what keeps both the plan section and plan_update's guidance "
|
||||
"out of every chat that is not carrying one.",
|
||||
"which is what keeps the plan section out of every chat not carrying one.",
|
||||
),
|
||||
Variable(
|
||||
"plan_editable",
|
||||
"The plan, when it can be changed",
|
||||
"The same text as {{plan}}, but blank in Plan mode -- where plan_update "
|
||||
"is withdrawn and the turn ends with plan_submit instead. Gates that "
|
||||
"tool's guidance, so a mode without the tool is not told to use it.",
|
||||
),
|
||||
Variable(
|
||||
"agent_instructions",
|
||||
@@ -614,9 +620,10 @@ BUILTIN: tuple[Fragment, ...] = (
|
||||
order=20,
|
||||
variables=("today", "timezone"),
|
||||
hint="A model has no clock. Without this it cannot tell whether what it "
|
||||
"recalls is current, and will not think to check. The timezone line "
|
||||
"carries its own variable, so it disappears on an instance where nobody "
|
||||
"has chosen one rather than announcing the server's as a decision.",
|
||||
"recalls is current, and will not think to check. {{timezone}} is the "
|
||||
"reader's own zone, or the server's where they have not chosen one -- "
|
||||
"the same zone the date above is already stated in, so it names a value "
|
||||
"rather than making a decision.",
|
||||
default=(
|
||||
"Today is {{today}}. Your training data stops well before this, so treat "
|
||||
"anything time-sensitive as something to check rather than something you "
|
||||
@@ -1314,20 +1321,28 @@ BUILTIN: tuple[Fragment, ...] = (
|
||||
families=("subagent",),
|
||||
requires=("agent_target",),
|
||||
hint="The agent-chat half, gated on `agent_target` so it appears only "
|
||||
"where there is a machine. What it has to say is what a helper cannot "
|
||||
"do there, because the failure otherwise is a model planning a whole "
|
||||
"phase around a helper that will refuse every step of it — a helper "
|
||||
"reads and may run a short list of read-only commands, and nothing "
|
||||
"else, whatever mode this chat is in.",
|
||||
"where there is a machine. What it has to say is where the edge is, "
|
||||
"because the failure otherwise is a model planning a whole phase around "
|
||||
"a helper that will refuse every step of it. Two edges, and they are "
|
||||
"different: **commands** are pinned to a read-only list in every mode, "
|
||||
"since an unattended chat cannot approve anything; **files** may be "
|
||||
"written, but only by a helper asked for with write and only from Edit "
|
||||
"or Auto. An earlier version denied the second outright — which is a "
|
||||
"documented parameter of the tool beside it — and named seven of the "
|
||||
"twenty-three allowed commands, so a model avoided commands it had.",
|
||||
default=(
|
||||
"- A helper on this machine reads and reports. It can list and read files "
|
||||
"and run the ordinary read-only commands — ls, cat, grep, find, git status, "
|
||||
"git log, git diff — and nothing else, in every mode, because there is "
|
||||
"nobody there to approve anything. Send one to find out where something "
|
||||
"lives, to read a subsystem and describe it, or to check whether a pattern "
|
||||
"holds across a tree; make the changes yourself once it reports.\n"
|
||||
"- Do not send one to build, test, install or run anything: it will be "
|
||||
"refused a step in and come back having done nothing.\n"
|
||||
"and run the read-only commands — ls, pwd, cat, head, tail, wc, file, stat, "
|
||||
"du, df, tree, find, grep, rg, and git status, log, show, diff, branch and "
|
||||
"remote. Send one to find out where something lives, to read a subsystem "
|
||||
"and describe it, or to check whether a pattern holds across a tree.\n"
|
||||
"- Do not send one to build, test, install or run anything. That list is "
|
||||
"the whole of what it may run, in every mode, because there is nobody "
|
||||
"there to approve anything else — a helper asked to run the tests is "
|
||||
"refused a step in and comes back having done nothing.\n"
|
||||
"- A helper asked for with write can also write and edit files, and only "
|
||||
"from Edit or Auto mode. Use it for a mechanical change across many files "
|
||||
"that you have already decided on; keep the deciding for yourself.\n"
|
||||
"- Ask for what you want back, not for a summary. “The three files that "
|
||||
"define X and what each does” is usable; “look into X” comes back as prose "
|
||||
"you have to read the codebase to check."
|
||||
@@ -1539,12 +1554,14 @@ BUILTIN: tuple[Fragment, ...] = (
|
||||
group=GROUP_TOOLS,
|
||||
order=255,
|
||||
families=("agent",),
|
||||
requires=("plan",),
|
||||
hint="Appears once a plan exists, which is also when plan_update is "
|
||||
"offered. It is about doing the bookkeeping as the work goes rather "
|
||||
"than at the end -- a plan updated only at the end is a report, and "
|
||||
"the point of it is being able to see where things are while they are "
|
||||
"still moving.",
|
||||
requires=("plan_editable",),
|
||||
hint="Appears when plan_update is actually offered: a plan exists and "
|
||||
"this is not Plan mode, which withdraws it in favour of plan_submit. "
|
||||
"Gated on {{plan}} it appeared in Plan mode too, telling a model to "
|
||||
"use a tool it did not have. It is about doing the bookkeeping as the "
|
||||
"work goes rather than at the end -- a plan updated only at the end is "
|
||||
"a report, and the point of it is being able to see where things are "
|
||||
"while they are still moving.",
|
||||
default=(
|
||||
"- There is a plan for this work, set out below. Keep it current with "
|
||||
"plan_update as you go rather than at the end: mark a task “doing” when "
|
||||
@@ -1567,16 +1584,18 @@ BUILTIN: tuple[Fragment, ...] = (
|
||||
requires=("plan",),
|
||||
variables=("plan",),
|
||||
hint="The plan as it stands, including what has already been ticked "
|
||||
"off. A plan the model cannot see is a plan it cannot update, which "
|
||||
"is what the whole of plan_update depends on. The ids are shown "
|
||||
"because they are what plan_update takes.",
|
||||
"off. A plan the model cannot see is a plan it cannot work to. Shown in "
|
||||
"every mode including Plan, where the tool for changing it is withdrawn "
|
||||
"-- so this says what the plan *is* and leaves how to change it to "
|
||||
"`tool.plan_update`, which is gated on that tool actually being there. "
|
||||
"The ids are shown because they are what plan_update takes.",
|
||||
default=(
|
||||
"### The current plan\n"
|
||||
"\n"
|
||||
"{{plan}}\n"
|
||||
"\n"
|
||||
"This is the plan as it stands now. Change it with plan_update rather "
|
||||
"than restating it in your answer, and quote the ids above."
|
||||
"This is the plan as it stands now. Work to it, and quote the ids above "
|
||||
"rather than restating the plan in your answer."
|
||||
),
|
||||
),
|
||||
Fragment(
|
||||
|
||||
Reference in New Issue
Block a user