Something a model could not do, and so wrote a note about instead

Asked to remind somebody every Monday, a model looked down its tool list, found
notes_create described as "something worth having in a later conversation" and
memory_add beginning with the word Remember, wrote a note, and reported that it
had scheduled something. Every screen agreed with it. There was no scheduling
tool at all -- the near-misses were the only thing there was to reach for, and
nothing anywhere said the thing it was being asked for existed.

The seam had been left open on purpose: Schedule.origin has defined
ORIGIN_MODEL, with no writer, since scheduling shipped, and services/schedules.py
says in its first line that it holds what the routes *and the tools* both need.
This is the tool that was meant to go through it.

Four of them, and a thin layer: rule.validate is still the one total normaliser
the form and the compile share, schedules.create still writes the row and the
task chat together, and rule.describe still says what came out. A second dialect
for models would mean two definitions of "every other Tuesday" and one of them
going quietly wrong.

The result is that description, never "done". A schedule is invisible until it
fires, which may be days away, so the sentence in the reply is the only moment
anybody can check that Monday was read as Monday -- and the tool says so, in the
text the model reads back. The list badges the ones nobody typed.

Gated on schedule.use rather than a permission of its own: somebody who may set
one up by hand may say so to a model instead, and a second checkbox beside the
first would only ever be answered "the same as that one".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jaroslav Beneš
2026-08-06 10:28:05 +02:00
co-authored by Claude Opus 5
parent 09156230b3
commit 9761082fa1
7 changed files with 894 additions and 5 deletions
@@ -44,6 +44,11 @@
</div>
<div class="btn-row">
{% if item.row.target == "report" %}<span class="badge">files a report</span>{% endif %}
{# Which of these nobody typed. A schedule is invisible until it fires, so
the list is where a model's decision is checkable at all -- and the
reader needs to be able to tell one apart from their own without
opening it. #}
{% if item.row.origin == "model" %}<span class="badge">set up for you</span>{% endif %}
{% if not item.row.enabled %}<span class="badge badge--warning">paused</span>{% endif %}
<a class="btn btn--sm" href="/scheduled/{{ item.row.id }}/edit">Edit</a>
</div>