M5c-1 plan: task 04, bxctl chat --speaker NAME, opt-in, no default

The speaker goes on every turn of the chat: interactive, --say and --say's retry. Without the
flag it is None. A name that is empty or holds whitespace or a control character (Unicode), or a
second --speaker, is a usage error: the usage text on stderr and exit status 2. The usage text
gains the flag and one line explaining it. Given: chat_speaker.rs (new) and new versions of
chat.rs, chat_approvals.rs and cli.rs. Task 01 now copies chat.rs-task01, the older chat.rs.

Checks: every before block found once at ref 03; replayed from the task text on a fresh ref-03
worktree with its own build directory, byte-identical to the reference, gate ok with 1158 tests
(1148 + 10); /tmp unchanged around the reference's and the replay's gate runs; 20 of 20
mutations caught; the new tests passed 40 of 40 runs under CPU load; given files pass fmt and
the 500-line check; no chat-template tag in the plan or the given files.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-28 01:04:27 -07:00
co-authored by Claude Opus 5.5
parent 5ca50257d4
commit 5454d7ea1b
7 changed files with 2048 additions and 5 deletions
+4 -2
View File
@@ -70,7 +70,8 @@ This is the complete list. Each one is covered by an edit below or by a given fi
`crates/loopd/tests/baseline.rs`, `channel.rs`, `instance.rs`, `memory.rs`,
`neutralise_replay.rs`, `session.rs`, `turn_done_untrusted.rs`;
`crates/memoryd/tests/serve.rs`, `crates/memoryd/tests/support/logs.rs`. Your `loopd`
`memory.rs` is the given `memory.rs-task01`: the given `memory.rs` is task 02's.
`memory.rs` is the given `memory.rs-task01`: the given `memory.rs` is task 02's. Your `bxctl`
`chat.rs` is the given `chat.rs-task01`: the given `chat.rs` is task 04's.
- Do not copy anything under `docs/plans/M5c1/files/crates/memoryd/tests/fixtures/honcho/`:
it is for later tasks.
- Modify: `crates/bxcore/src/wire.rs`, `crates/bxcore/src/log.rs`, `crates/bxcore/src/memory.rs`,
@@ -426,7 +427,8 @@ becomes
cp docs/plans/M5c1/files/crates/bxcore/tests/records.rs crates/bxcore/tests/
cp docs/plans/M5c1/files/crates/bxcore/tests/strict.rs crates/bxcore/tests/
cp docs/plans/M5c1/files/crates/brokerd/tests/broker.rs crates/brokerd/tests/
cp docs/plans/M5c1/files/crates/bxctl/tests/chat.rs crates/bxctl/tests/
cp docs/plans/M5c1/files/crates/bxctl/tests/chat.rs-task01 \
crates/bxctl/tests/chat.rs
cp docs/plans/M5c1/files/crates/loopd/tests/baseline.rs crates/loopd/tests/
cp docs/plans/M5c1/files/crates/loopd/tests/channel.rs crates/loopd/tests/
cp docs/plans/M5c1/files/crates/loopd/tests/instance.rs crates/loopd/tests/