Skip to content

status: an aria remembers how its last turn ended - #21

Open
jack-work wants to merge 1 commit into
mainfrom
feat/status-last-turn-result
Open

jack-work wants to merge 1 commit into
mainfrom
feat/status-last-turn-result

Conversation

@jack-work

Copy link
Copy Markdown
Owner

Independent of the rest of the stack; branches off main.

The gap

$ figaro status 94f0752b
figaro       94f0752b
  state:      idle

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 fix

The outcome was already computed — finishTurn(reason) has always known it, 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: the status bar

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.

`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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant