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:
@@ -188,10 +188,23 @@ def context_variables(
|
||||
"today": stamp.strftime("%A %-d %B %Y"),
|
||||
"now": stamp.strftime("%A %-d %B %Y, %H:%M (UTC%z)"),
|
||||
# Named so a model working out a schedule can say which zone it meant,
|
||||
# and so `core.today` can carry it without a second fragment. Empty when
|
||||
# nobody has chosen one, which drops the line rather than printing the
|
||||
# server's zone as though it were a decision.
|
||||
"timezone": clock.name_for(user),
|
||||
# and so `core.today` can carry it without a second fragment.
|
||||
#
|
||||
# The fallback is load-bearing and used to be absent. `name_for` returns
|
||||
# "" for anybody who has never chosen a zone -- the default state of
|
||||
# every account -- and the comment here claimed that dropped the line
|
||||
# rather than announcing the server's zone as a decision. It did not:
|
||||
# `substitute` drops a line only when it is *blank* after expansion, and
|
||||
# this variable sits inside a sentence, so every such request shipped
|
||||
# "- Times the person gives you are in unless they say otherwise."
|
||||
#
|
||||
# Naming the server's zone was never the thing being avoided anyway.
|
||||
# `stamp` is `clock.now_for(user)`, which already falls back to it, so
|
||||
# `{{today}}` and `{{now}}` are *already* in that zone and `{{now}}`
|
||||
# already prints its offset. Withholding the label from a value the
|
||||
# model has been given is not restraint, it is a hole. This is the
|
||||
# fallback `schedule/compile.py` has always had, for the same reason.
|
||||
"timezone": clock.name_for(user) or str(clock.server_zone()),
|
||||
"instance_name": branding.for_db(db).name,
|
||||
"user_name": (user.name or "") if user is not None else "",
|
||||
"model_name": "",
|
||||
@@ -241,6 +254,7 @@ def context_variables(
|
||||
"agent_instructions": "",
|
||||
"agent_instructions_file": "",
|
||||
"plan": "",
|
||||
"plan_editable": "",
|
||||
# Empty everywhere but a scheduled task's own chat, which is what makes
|
||||
# it the gate on `core.unattended` as well as the content of
|
||||
# `context.schedule`. Two fragments, one variable, and no way for the
|
||||
@@ -346,6 +360,17 @@ def _agent_values(db: DBSession, chat, user) -> dict[str, str]:
|
||||
# `agent_session.resolve`. A plan the model cannot see is a plan it
|
||||
# cannot keep current, which is the whole of why this is here.
|
||||
"plan": plans_service.render_block(context.plan),
|
||||
# Whether `plan_update` is actually in this request, which is not the
|
||||
# same question as whether there is a plan. `agent/tools.py` drops it in
|
||||
# Plan mode -- that mode ends with `plan_submit` instead -- so gating its
|
||||
# guidance on `plan` alone told a model in Plan mode to "keep it current
|
||||
# with plan_update as you go" about a tool that was not there, directly
|
||||
# under `core.tool_list` saying anything unnamed does not exist. The
|
||||
# fragment's own hint claimed the two coincided. They do not, and this
|
||||
# is the variable that makes them.
|
||||
"plan_editable": (
|
||||
plans_service.render_block(context.plan) if context.mode != policy.MODE_PLAN else ""
|
||||
),
|
||||
**_project_instructions(db, chat, context, settings_store),
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user