Commit Graph
108 Commits
Author SHA1 Message Date
kyleandGrok 4.6 d928e5b069 docs: M5d-2 given tests drop unused SessionId and DataClass
scheduler_cron imported SessionId without using it; clippy unused-imports
failed the task 07 gate. tiers.rs had the same for DataClass.

Co-Authored-By: Grok 4.6 <noreply@x.ai>
2026-10-03 02:04:53 -07:00
kyleandGrok 4.6 09e362690e docs: M5d-2 hold returns Busy, not Result<(), ()>
clippy result_unit_err is denied by the gate. Context::hold uses a Busy
unit struct; the given tests still only expect Ok.

Co-Authored-By: Grok 4.6 <noreply@x.ai>
2026-10-03 01:56:52 -07:00
kyleandGrok 4.6 e697589b98 docs: M5d-2 task 03 updates the main.rs m5c() count
ask_memory_tool pins Registry::m5c() in main.rs at exactly one call.
Heartbeat's check_summarise adds two more; the task now edits that count
to 3 and still forbids m2b/m3a/m5a.

Co-Authored-By: Grok 4.6 <noreply@x.ai>
2026-10-03 01:43:00 -07:00
kyleandGrok 4.6 c4a8f9488d docs: M5d-2 given tests: unused import and leftover-held
scheduler_heartbeat imported scheduler::{self} without using it, which
clippy -D warnings would fail at task 06. The live-previous cron tick now
asserts a held leftover stays started.

Co-Authored-By: Grok 4.6 <noreply@x.ai>
2026-10-03 01:39:50 -07:00
kyleandGrok 4.6 df987c3058 docs: M5d-2 checklist: given-test lifetimes and cron AND
session_slot and the scheduler tests held a temporary JSON Value across
statements (E0716). Cron now pins DOM and DOW as AND, which the given tests
had not. Gate counts from task 04 on move up by one.

Co-Authored-By: Grok 4.6 <noreply@x.ai>
2026-10-03 01:31:07 -07:00
kyleandGrok 4.6 fb2e269a85 docs: M5d-2 gate count 1508 and OpenCode model id
The M5d-1 gate on straylight is 1508, so every M5d-2 expected count moves up by one.
OpenCode 1.15.10 serves Ornith as llama.cpp/ornith-1.5-35b-a3b.

Co-Authored-By: Grok 4.6 <noreply@x.ai>
2026-10-03 01:24:25 -07:00
kyleandGrok 4.6 c3b05cf003 docs: M5d-1 checklist fixes before hand-over
Given tests: Action::Turn (not To), send_turn of epoch 1, clippy on
compact_summary, jsonl-without-baseline, live turn after compact sends
the carry. send_turn maps Damaged to Local("log") as read_turn did.
Gate counts 1484 → 1508. Mutations recorded in the README.

Co-Authored-By: Grok 4.6 <noreply@x.ai>
2026-10-02 22:36:51 -07:00
kyleandGrok 4.6 3726ae585f docs: M5d-1 and M5d-2 implementation plans for Ornith
Eight closed tasks for epochs and compaction, then ten for the scheduler,
ToolSummary, and tiers. Given tests first. Gate 1456 → 1507 → 1572.

Co-Authored-By: Grok 4.6 <noreply@x.ai>
2026-10-02 21:54:37 -07:00
kyleandClaude Opus 5.5 62aaadd17e M5c-2 plan: README wrap-up: the tasks with their counts, known flaky tests and known limits
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 21:27:53 -07:00
kyleandClaude Opus 5.5 f6a1f1831e M5c-2 plan: task 12, memoryd serves ask_memory
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 21:27:10 -07:00
kyleandClaude Opus 5.5 5b39b7ffc3 M5c-2 plan: task 11, the admin socket's requests move out of serve.rs
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 21:07:18 -07:00
kyleandClaude Opus 5.5 531a723e39 M5c-2 plan: task 10, ask_memory in memoryd; task 08 keeps its own copy of the fake Honcho
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 20:18:33 -07:00
kyleandClaude Opus 5.5 30538b0243 M5c-2 plan: task 09, recall asks Honcho outside the state lock
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 19:58:04 -07:00
kyleandClaude Opus 5.5 d41c41eb4a M5c-2 plan: task 08, recall's Honcho part; the wiring split out as task 09
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 19:30:58 -07:00
kyleandClaude Opus 5.5 109aacbd1b M5c-2 plan: task 07, local recall items in the one indented form; later tasks renumbered
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 19:06:36 -07:00
kyleandClaude Opus 5.5 484804c00a bxctl: chat_approvals' helper accepts a broken pipe on stdin
json_prints_only_json_and_never_asks_brokerd failed once under load: the helper wrote the typed
input to a `bxctl chat --json` that never reads stdin and had already exited, and unwrapped the
broken pipe. A broken pipe on that write is now accepted; any other error still fails the test,
and a test whose input must be read checks the output.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 18:49:56 -07:00
kyleandClaude Opus 5.5 c2c8d47f37 M5c-2 plan: task 06, Honcho's results as recall items
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 18:48:35 -07:00
kyleandClaude Opus 5.5 9a4f0c5875 M5c-2 plan: task 05, memoryd's readers
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 18:31:51 -07:00
kyleandClaude Opus 5.5 c6f43002a8 M5c-2 plan: task 04, maxItems verified; a comment kept to 100 columns
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 18:08:32 -07:00
kyleandClaude Opus 5.5 9cab92f735 M5c-2 plan: task 04, loopd declares ask_memory and waits 180 s for it
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 18:07:00 -07:00
kyleandClaude Opus 5.5 73a94e5106 M5c-2 plan: task 03, brokerd's wait for ask_memory
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 17:39:39 -07:00
kyleandClaude Opus 5.5 77a7e8854b M5c-2 plan: task 02, brokerd knows ask_memory; the outline split to nine tasks
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 17:39:39 -07:00
kyleandClaude Opus 5.5 cdd0a40207 M5c-2 plan: task 01, workspace names up to memoryd's 512
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:59:35 -07:00
kyleandClaude Opus 5.5 2adcb734a5 M5c-2 plan: task 01, ask_memory's arguments
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:49:03 -07:00
kyleandClaude Opus 5.5 88963bc7ae M5c-2 plan: task 00 done; the outline follows the recordings
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 16:21:03 -07:00
kyleandClaude Opus 5.5 d75c64672e M5c-2 plan: outline for the owner's review
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 15:58:53 -07:00
kyleandClaude Opus 5.5 572b582038 docs: M5c-1 review finding 7 closed: the two flaky tests fixed
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 14:26:52 -07:00
kyleandClaude Opus 5.5 027146f359 M5c-1 plan: README, tasks 07 to 15, the owner's decisions, the known flaky test; M5b finding 8 closed
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 10:00:59 -07:00
kyleandClaude Opus 5.5 d8952ca77d M5c-1 plan: task 15, sync from when Honcho is on, conclusions matched by peer
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 09:58:26 -07:00
kyleandClaude Opus 5.5 44d597524b M5c-1 plan: task 14, bxctl memory sync
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 09:38:50 -07:00
kyleandClaude Opus 5.5 687d07a9a7 M5c-1 plan: task 13, the Honcho worker sends memory writes
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 09:27:51 -07:00
kyleandClaude Opus 5.5 d3d37c955a M5c-1 plan: task 12, memory writes decided for Honcho as they are journalled
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 09:08:56 -07:00
kyleandClaude Opus 5.5 67ddda514b M5c-1 plan: task 11, the Honcho worker that sends turns
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 08:45:55 -07:00
kyleandClaude Opus 5.5 a359f34a73 M5c-1 plan: task 10, the Honcho clients and the ensure steps in memoryd
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 08:05:57 -07:00
kyleandClaude Opus 5.5 47d846eb77 M5c-1 plan: task 09, turns decided on SessionUpdated after loopd has its answer
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 07:42:23 -07:00
kyleandClaude Opus 5.5 991545c778 M5c-1 plan: task 08, the turn decision in memoryd
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 06:57:08 -07:00
kyleandClaude Opus 5.5 aef6525cc7 M5c-1 plan: task 07, the Honcho ledger in memoryd
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 06:43:05 -07:00
kyleandClaude Opus 5.5 0e1e070fc3 M5c-1 plan: task 06, memoryd checks [honcho] and its keys at start
memoryd.toml gains an optional [honcho] section, [[honcho.read]] and the
Honcho keys in [secrets.<name>], checked at start into
memoryd::honcho::config::HonchoConfig (13 reasons, runbook entry
honcho-config-invalid given as a fragment), and [sockets] state for
brokerd's state.sock. Keys are checked, never read; no [honcho] leaves
memoryd as it was. memoryd enables bxcore's feature secrets.

Checks: a reference at ref 05 + this task passes make gate with 1188
tests (1171 + 17); /tmp unchanged around the gate; the given tests fail
before as the task says (two targets do not compile, 4 start tests
fail); 49 one-line mutations of the reference, all caught (one gap, a
URL with a user and no password, found and closed); the new tests 40
times under CPU load, no failure; a replay from the task text on a fresh
ref-05 worktree with its own target is byte-identical and passes the
gate, and every before block was found once; given files pass fmt and
the 500-line limit; no chat-template tag in any file.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 02:48:16 -07:00
kyleandClaude Opus 5.5 ba8267c7dc M5c-1 plan: task 05, brokerd answers memoryd's session-state question on state.sock
brokerd serves a third socket, [sockets] state (default
<home>/run/memory-broker/state.sock), bound by the same listen (dir 0700,
stale socket removed, socket 0600), one thread per connection, one
question per connection. The answer is StateStore::read: the stored taint
and flag, the store's default (private, trusted) for a session with no
file. A damaged state is an internal error with the store's text, never an
answer; other kinds are forbidden; malformed frames get read_request's
error. A new tests/serve.rs waits for an answer before reading the
startup notices (a race that failed about one run in ten under load,
before this task too).

Checks: every before block found once at ref 04 (20 edits); the new file
in the task is byte-identical to the reference; the given tests fail
before as the task says (config and state_socket do not compile;
serve_state 5 of 5 fail); gate ok with 1171 tests on the reference and on
a replay from the task text in a fresh ref-04 worktree with its own build
dir (byte-identical to the reference; removed); /tmp unchanged around the
gate; 25 mutations, 24 caught, the one missed (state bound last) changes
no tested behaviour; the socket tests 25 runs under load, 0 failures;
no task-text line over 100 characters outside tables and code.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 01:52:06 -07:00
kyleandClaude Opus 5.5 5454d7ea1b 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>
2026-09-28 01:04:27 -07:00
kyleandClaude Opus 5.5 5465946d98 M5c-1 plan: task 03, gatewayd sets the speaker from the burst's one author
A batch carries the Mattermost user id of each message; the turn's speaker
is the username of the one user who wrote all of it (Client::username,
kept in a map on the event loop), and None for two or more people or a
failed lookup. The turn's text is unchanged.

Checks: reference replayed from the task text on a fresh ref-02 worktree
with its own build dir, byte-identical; make gate ok with 1148 tests
(1138 + 10); /tmp unchanged around both gate runs; 21 mutations, all
caught; new tests stressed 40 times under load, no failure; every before
block found once at ref 02; no chat-template tags.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 00:30:24 -07:00
kyleandClaude Opus 5.5 d2e6cfa51f flake: Rust 1.98.1 from rust-overlay; rust-version 1.98
The owner's hosts (titan, talos) run 1.98.1; nixos-26.05's Rust is
1.95.0, so builds and lints differed by host. The flake gains a second
input, oxalica's rust-overlay (following our nixpkgs, so host configs
can still follow theirs), and both the package build and the dev shell
use its stable 1.98.1 with clippy and rustfmt. The workspace's
rust-version rises to 1.98 to match; AGENTS.md, docs/dependencies.md
and the M5c-1 plan follow.

Checked on straylight: nix build gives all seven binaries; the dev
shell has rustc, cargo and clippy 1.98.1, rustfmt 1.9.0, cargo-deny
0.19.6; make gate in it passes with 1122 tests, as on titan.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 00:04:38 -07:00
kyleandClaude Opus 5.5 0a59dc0b22 M5c-1 plan: task 02, loopd logs the speaker and sends the turn's number
loopd copies the Turn's speaker onto the User record it logs, as it
came (not checked, not neutralised), and never into a request; after a
finished turn it sends SessionUpdated with the turn's number, the count
of User records in the session's log (Session::turns), so the first
turn is 1, a failed turn that was logged counts, and the count goes on
after a reopen or a restart. Failed turns are still not told.

Given: speaker_turn.rs (8 tests) and new versions of loopd's memory.rs,
turn_broker.rs, end_to_end.rs and support/turn.rs (run_turn gains
speaker, MemorySource::updated gains turn). Task 01 now copies
memory.rs-task01, its own version.

Checks: the reference passes make gate with 1138 tests (1130 + 8); the
task replayed from its text on a fresh ref-01 worktree with its own
target is byte-identical to the reference and passes the gate; /tmp
unchanged around both gate runs; 15 one-line mutations (speaker not
logged or dropped by the channel or neutralised, speaker in the request
at log time or at replay, turn 0-based or +1, counting Assistant
records, all records or only speakers' turns, a global or per-process
counter, told before logging or on failure, MemoryPort sending 0) all
caught; speaker_turn run 60 times under load, no failure; no
chat-template tag in the plan or given files; task lines within 100
characters but tables.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-27 23:49:35 -07:00
kyleandClaude Opus 5.5 82b7898e84 M5c-1 plan: task 01, the speaker, SessionUpdated's turn, the session-state messages
Task 01 changes bxcore's wire and log types for M5c-1: Turn.speaker and
LogRecord::User.speaker (optional, skipped when None, so old frames and logs
keep their bytes), SessionUpdated.turn (required, refused when missing), and
the new SessionState / SessionStateReply messages. The other crates only
construct the new fields (speaker: None, turn: 0) and brokerd's kind() names
the two new kinds; later tasks give them values. 20 given files.

Checks, against a reference at 7b40686 with its own build directory:
- every "before" block found exactly once at 7b40686 (and at master, which
  changed no crate since);
- step 2's failures as the task names them: two strict tests, fifteen test
  targets with E0559/E0560/E0432/E0599 only;
- make gate: gate: ok, 1130 tests (1122 + 8); /tmp unchanged around it;
- replay from the task text in a fresh worktree of 7b40686 with its own
  target/: crates/ byte-identical to the reference, gate ok, 1130; removed;
- 23 mutations: 21 caught; the two that drop `default` from an Option
  field cannot change behaviour (serde reads a missing Option as None);
- no chat-template tag whole in the task or the given files; lines over
  100 characters only in tables, fixtures and verbatim strings.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-27 23:22:37 -07:00
kyleandClaude Opus 5.5 b8ebfd45ed M5c-1 plan: Honcho responses recorded from rift (task 00)
29 request/response pairs, each request exactly as roncho 1.0.0's
blocking client sends it, recorded in a throwaway workspace
(boxmaker-plan-probe) created for it and deleted afterwards; no other
workspace was touched. For the fake Honcho server of task 10. Found:
creation is get-or-create (201, then 200); adding messages to a missing
session creates it; a 422 echoes the whole input; a deleted conclusion
answers 204 with an empty body, and 404 the second time.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-27 22:59:04 -07:00
kyleandClaude Opus 5.5 76a655062e M5c-1 plan: the owner's answers (speaker opt-in; rift probe workspace only)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-27 22:45:50 -07:00
kyleandClaude Opus 5.5 339de0fdc2 M5c-1 plan: outline for the owner's review
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-27 22:34:43 -07:00
kyleandClaude Opus 5.5 ba3c89791f M5b plan: README brought up to the written tasks
The task table follows the files (03 tags, 04 refuse, 05 flag) and
gives each task's gate count and mutations; the interfaces are the ones
the tasks built (task 02's role argument and SecretSpec, Refusal.at,
Flag, TurnDone.untrusted required, disarm, LockError::line); the review
focus names the tasks that pin each item; which task adds each runbook
entry, and the -taskNN convention for replaced given copies.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-26 17:30:44 -07:00
kyleandClaude Opus 5.5 81d849d4ba M5b plan: task 14, the runbook entry sanitizer-rules
The last runbook entry, the rule-change procedure of spec 6.5; the
entries memory-write-refused and memory-write-flagged now send the
reader to it instead of to the spec. Tasks 06, 08 and 12 added the
other five, because the gate needs an entry for every pointer.

Checks: the edits, applied from the task's text to ref 13, give a
runbook byte-identical to the reference; each before block found once;
the gate passes on the reference with 1118 tests; /private/tmp unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-26 17:29:50 -07:00
kyleandClaude Opus 5.5 5f48ba65b0 M5b plan: task 13, instance lock in brokerd, memoryd and gatewayd
Each locks <home>/run/<role>.lock in main (gatewayd after its secret,
so nothing is made before the secret is read). brokerd's old
second-instance test in serve.rs expected the audit lock's message,
so serve.rs has a new version; task 01 now copies serve.rs-task01.

Checks: given tests fail at ref 12 as the task says (2 each in
brokerd, memoryd, gatewayd; serve.rs passes); the task's quoted edits
applied to ref 12 reproduce ref 13's tree exactly; replay gate ok with
1118 tests (1113 - 1 + 6), /tmp unchanged; 14 mutations, all caught;
the six instance test files stressed 25 runs under 16 busy loops and
20 under 32, no failure.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-26 17:21:14 -07:00