Skip to content

Refuse --answers naming a unit ask the action never reaches - #2883

Merged
trissim merged 1 commit into
mainfrom
fix/answers-reach-asker
Oct 23, 2026
Merged

trissim merged 1 commit into
mainfrom
fix/answers-reach-asker

Conversation

@trissim

@trissim trissim commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

order say/send/strike/problem --answers ID counted a unit's question as answered even when the action went to a different thread. On 2026-10-23 unit-mi-1a's question 3dce7e7182d8 was "answered" by an order to unit-reviewer; mi-1a got no reply and sat blocked 22 minutes.

  • OwedAnswer.misaddressed(named, reached) (standing_rules.py:365): default refuses nothing.
  • UnitAskUnanswered.misaddressed (commander/standing.py:210): a unit's ask counts only when the action reaches that unit; otherwise "ID was asked by UNIT; answer it in a message to UNIT".
  • DirectiveVerb.addressed (commander/order.py:827) is declared by Send, Strike, Say and Problem; the gate (order.py:812) refuses before anything is sent.
  • Owner directives and escalation bursts are unchanged: an owner directive is answered by an action anywhere, and a burst by any line of it.

Proof: tests/test_holder_standing_rules.py::test_an_answer_sent_to_another_unit_is_refused_and_leaves_the_ask_owed — a say to outsider naming worker's ask exits with the asker named, the bus revision is unchanged, and the ask stays owed. tests/test_holder_standing_rules.py: 41 passed locally (one earlier full run showed 1 failure that did not reproduce on rerun; not identified).

Overlap: #2878 (P476) and #2469 touch the same three source files. This edit is kept to small additions so a merge resolves trivially.

Assumed: the thread names a verb passes are the threads its message is for (Say uses VerdictAudience, so #comms reaches no unit's ask); UnitAskUnanswered.unit is the asker's canonical name.

🤖 Generated with Claude Code

`order say/send/strike/problem --answers ID` accepted a unit's question even
when the action went to a different thread. The gate counted the ask as
answered, AnsweredSource recorded it, and the asker never got a reply: on
2026-10-23 unit-mi-1a's question 3dce7e7182d8 was "answered" by an order to
unit-reviewer and mi-1a sat blocked 22 minutes.

OwedAnswer now owns whether naming a debt in an action that reaches given
threads would record an answer its asker never receives (misaddressed). Only
UnitAskUnanswered refuses: a unit's ask is answered by a message to that
unit. Owner directives and escalation bursts keep their own answered_by
rules. Each DirectiveVerb declares the threads its message is for, and the
gate refuses before anything is sent, naming the real asker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 23, 2026 19:38

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@trissim
trissim merged commit 45bf145 into main Oct 23, 2026
8 checks passed
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.

2 participants