Repository navigation
v0.5.3
Three defects of one kind, all found by operating the reference tannery: a
configuration or prompt mistake that produced no error, only a run that looked
successful. Two are fixed by failing closed at load; the third replaces a prompt
sentence with a mechanism.
Added
require_tool:— a turn that must act cannot end on text
(#84).
A turn whose job is to dispatch, file, or publish ends the moment the model
produces text, and producing text instead of acting is the failure mode:
observed, a fan-out agent composed five dispatch blocks as its reply, called
nothing, and recorded success while zero downstream work was queued. The only
defense was a sentence in the prompt, re-breakable by anyone who rewrote it.
A turn header may now name required tools; a text response arriving with none
of them called is refused, the model is told to make the call, and the turn
continues. If the turn's tool rounds run out first the run fails, naming the
turn and the tool. Any one named tool satisfies the requirement, and a call
that fails counts — the requirement is that the model attempted the act. A
requirement no tool in that turn's scope can satisfy is rejected by
leather validateand again at run start, before the first LLM call.
Fixed
- An unrecognized turn header key is an error, not prompt text
(#82).
The turn parser recognized four keys and silently treated any other
declaration-shaped line as the first line of the prompt.tool_rounds: 12set
no budget and shipped to the model as prose; a typo'dtoolset:left the turn
inheriting the previous turn's scope, which is the case where a turn written
to drop a write tool keeps it. Both produced a clean run and no warning. A
header-position line naming an unrecognized key now fails the load, naming the
file, the turn, and the five recognized keys. The header also ends at the
first blank line, so a prompt that genuinely opens withword:has somewhere
to put it. Measured against every agent underexamples/and every agent
block indocs/: no existing turn changes meaning. - Lifecycle
output: type: queueproduced items no curing could consume
(#83).
The route enqueued an item carrying only a payload. A curing's first act is to
load its item's hide, so every item this route produced hit "hide missing" and
dead-lettered on first touch — there was no input for which it worked, and the
schema accepted it,leather validatepassed it, and the failure surfaced only
as a growing DLQ. The route now writes the response to the hide store and
enqueues a reference to it, matching what curing-to-curing chaining already
did. Where no hide store is available the route warns and enqueues nothing
rather than producing an item guaranteed to dead-letter.
Documentation
docs/GUIDE.mdgains the full turn-header key table, therequire_tool
contract, a shape-selection table for picking between cron, curing, fan-out
and fan-in, five authoring anti-patterns drawn from live failures, and two
corrections:hide_typesdoes not filter chained artifacts (a chained hide
carries the upstream curing's name as its kind), andpage_size_bytessmaller
than the document silently drops the tail an end-of-document guard depends on.