Skip to content

fix(herdr): confirm busy-Pi steering-queue delivery instead of false pending verdict - #12

Merged
knowttl merged 3 commits into
mainfrom
fm/fix-pi-herdr-busy-send
Jul 29, 2026
Merged

knowttl merged 3 commits into
mainfrom
fm/fix-pi-herdr-busy-send

Conversation

@knowttl

@knowttl knowttl commented Jul 29, 2026

Copy link
Copy Markdown
Owner

Problem

fm-send falsely reported delivery unconfirmed; verdict=pending when delivering an ordinary instruction to a Pi agent that was already generating a response under the Herdr runtime, even though Pi had accepted the text into its visible Steering: queue and later acted on it.

Fix

  • bin/backends/herdr.sh: fm_backend_herdr_send_text_submit now confirms a busy Pi agent's steering-queue acceptance as a successful delivery, bound to the current send (queue key derived from the first line) so a stale Steering: transcript line cannot create false success. A busy Pi /reload rejection is reported as an accurate retry-when-idle outcome rather than a false success. Ambiguous/unreadable panes and real unsubmitted composer text retain conservative non-success behavior.
  • bin/fm-send.sh: propagates the busy-Pi queued-delivery confirmation.
  • Idle Pi submission and all non-Pi Herdr paths are unchanged.

Tests

Added focused regression coverage in tests/fm-backend-herdr.test.sh for busy accepted steering, busy rejected /reload, stale steering evidence, idle submission baseline, ambiguous panes, non-Pi fallback, and duplicate prevention.

Local verification (c8dca18)

  • tests/fm-backend-herdr.test.sh — green
  • tests/fm-send-strict.test.sh, fm-send-settle, fm-send-popup-settle, fm-composer-lib — green
  • tests/fm-documentation-audiences.test.sh — green
  • bin/fm-lint.sh — exits clean (ShellCheck not installed in this environment; full CI-parity lint not run locally)

Docs

Updated docs/herdr-backend.md, docs/architecture.md, docs/configuration.md, and the harness-adapters/afk skills to describe the corrected busy-Pi submit-confirmation contract.

knowttl added 3 commits July 28, 2026 15:56
An ordinary instruction sent to a Pi agent that was already responding was
accepted into Pi's steering queue and acted on, but fm-send reported it as
unsubmitted and exited nonzero. A busy baseline could only fall back to
composer clearance, and a busy Pi's composer is cleared by the very
submission being confirmed, so nothing on that path could observe the
delivery.

A busy Pi submit is now confirmed from Pi's own queued-input rows, bound to
the current send by a new matching entry so an older identical row cannot
create false success. Input that Pi consumes while busy without queueing it
reports the new busy-unqueued verdict, and fm-send turns that into an
actionable retry-when-idle failure instead of claiming delivery. The rule is
transport-generic: no command name or harness message is inspected. Real
unsubmitted composer text still reports pending, unreadable panes still
report unknown, and the idle Pi path plus every non-Pi busy path are
unchanged. The message is still typed exactly once.
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