Repository navigation
Conversation
`figaro status 94f0752b` said:
state: idle
and that was the whole answer, while three prompts sat in the log with
nothing after them and the last turn had died on a provider error. Nothing
was lying. "idle" is a statement about the INBOX; it says nothing about
whether the last thing the user asked for worked, and reporting only the
first is exactly how a failed turn gets reported as a hang.
The outcome was already computed - finishTurn(reason) has always known, and
fans it out on turn.done - and then dropped on the floor, visible only to
whoever happened to be attached at that instant. Retaining one string and one
timestamp turns "it is not responding" into "its last turn failed nine
minutes ago, and here is what the provider said":
figaro 94f0752b
state: idle
last-turn: error: anthropic: rate_limit_error (429): the provider
asked us to wait 1h0m0s ... (9m0s ago)
unanswered: 3 prompt(s) with no reply
unanswered counts input messages at the tail with no assistant message after
them: work taken and nothing produced. It is distinct from a queue backlog -
these are already committed to the log, which is why `queue ls` came back
empty while three questions went unanswered. The scan is bounded; only the
tail can be unanswered.
A turn that simply completed earns no row. A status panel that reports every
success teaches people to skim past the one line that mattered.
Also: `figaro listen` now surfaces an error reason through lt.report rather
than writing it straight to stderr, which is what `send` has done since the
pager landed. Straight-to-stderr lands ON the footer while the pager owns the
terminal and scrolls the grid out from under the painter, so a turn that
failed while you were tailing it could leave no visible trace at all. report
picks the right door and puts it in the status row's red notice.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Independent of the rest of the stack; branches off
main.The gap
That was the whole answer, while three prompts sat in the log with nothing after them and the last turn had died on a provider error.
Nothing was lying.
idleis a statement about the inbox. It says nothing about whether the last thing the user asked for worked, and reporting only the first is exactly how a failed turn gets reported as a hang.The fix
The outcome was already computed —
finishTurn(reason)has always known it, and fans it out onturn.done— and then dropped on the floor, visible only to whoever happened to be attached at that instant. Retaining one string and one timestamp turns "it is not responding" into "its last turn failed nine minutes ago, and here is what the provider said":unansweredcounts input messages at the tail with no assistant message after them: work taken and nothing produced. It is distinct from a queue backlog — these are already committed to the log, which is whyqueue lscame back empty while three questions went unanswered. The scan is bounded; only the tail can be unanswered.A turn that simply completed earns no row. A status panel that reports every success teaches people to skim past the one line that mattered.
Also: the status bar
figaro listennow surfaces an error reason throughlt.reportrather than writing it straight to stderr — which is whatsendhas done since the pager landed. Straight-to-stderr lands on the footer while the pager owns the terminal and scrolls the grid out from under the painter, so a turn that failed while you were tailing it could leave no visible trace at all.reportpicks the right door and puts it in the status row's red notice.