room: tell a blocked strand inside the round it is blocked in #133
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "land/task/santi-block-escalation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
room: tell a blocked strand inside the round it is blocked in
Blocking worked and the soul still could not act on it. Offered one tool
and nothing else, it reported that the session had no shell and stopped,
because nothing had told it why. The refusal only exists when shell is
called, and a blocked strand cannot call shell; the notice queue drains
at the top of a round, and a blocked turn is one round long, so the
notice was always a round late. Being blocked shortens the turn, and the
in-turn channel needs the turn to be long. The two exclude each other.
So the condition enters the assembly of the round it holds in, from the
same text the tool gate would have refused with. One source, so what the
soul reads in its context and what it would meet at the gate cannot
disagree. Verified on a strand that had just answered "no shell
available": with the condition in the round, it absorbed five slots into
one on its first call.
Slot overflow also gains a band of its own. Byte pressure was banded and
announced, but a strand can exceed its slot ceiling while barely using
its budget, which is the state that was silently reached earlier, and no
reminder mentioned slots at all. The reminder now carries the occupancy
and names absorbing as the only admitted compaction.
Escalation, per Perish: three refusals without resolution ends the turn
with a cause of its own and reports through the event stream, which is
the operator's surface and stays alive as long as the work does. Nothing
is compacted on the soul's behalf. This path has not been observed,
because every blocked strand so far resolved itself on the first attempt.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
slots: hold a budget, not a grid of equal cells
Three cells of thirty thousand bytes each said more than it should. A
soul could not put most of its settled history into one authoritative
summary while leaving the others empty, though nothing about the resource
being protected forbids it. What is scarce is the bytes the compacted
timeline occupies; how they are divided is a judgement about the content,
and that belongs to the soul.
So the compacted region carries a total, and the summaries within it are
bounded only by that total. The per-summary ceiling is gone.
A count ceiling stays, at five, and it is not a second budget. Bytes
alone do not punish fragmentation: ten summaries of fifteen hundred bytes
sit comfortably inside any sensible total, and that is precisely the
shape observed on a real strand, where the tail had been compacted again
and again without anything earlier ever being rewritten. The count is
what makes the next compaction a rewrite instead of an append. A minimum
size was considered and rejected: it would refuse a small settled range
outright, and a strand whose tail is always short could then never
compact at all.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
compact: address slots by name, not by archaeology
Absorbing meant naming a range that happened to span two slots, so the
soul had to recover the message ids bounding each one before it could
merge them, from a report that gave ids and byte counts and no
boundaries. The operation it wanted to express was declarative — these
slots become one, and this is what survives — and it had to be translated
into a range by hand every time.
So it can name them. Absorbing two or more merges them; naming one
rewrites its summary in place, which had no expression at all before; and
naming none still collapses the settled tail. Three operations over the
same partition, one request shape, boundaries derived from the slots
themselves.
A non-contiguous set is refused, and the refusal names the slot lying
between the ones chosen. Collapsing it silently would swallow history the
soul did not choose to give up, and choosing for it is the one thing this
design does not do.
Occupancy now reports each slot's range beside its id and size, because
choosing what to merge needs to know what each one covers.
Both contract digests move, each checked against an unchanged build in a
cleared environment first: the schemas gained a field apiece and the
command line gained the option, with no path or removal.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
prompt: let the explanation travel with the exit
The context limits were stated in the system prompt, rendered from live
policy so they could not drift. Every strand paid for them on every
round, including the ones that would never approach a ceiling, for
guidance about a state most of them are never in.
The exit is already state-dependent: the compact tool exists only while
the ceiling refuses ordinary work. Its description is therefore present
exactly when it can be acted on and absent otherwise, so that is where
the guidance belongs, and the suggested ordering moves there with it. The
condition itself already enters the round it holds in, so a soul that
meets a block learns what happened and what to do from two sources, both
of which appear only when they matter.
This also retires the synchronisation it created: a description that ships
with the tool it describes cannot disagree with it.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com