Commit Graph
487 Commits
Author SHA1 Message Date
kyleandClaude Opus 5.5 46b2927d0a M5a plan: task 18, a note cannot forge a notes.md header
entry_problem refuses any line that starts with the separator, and a noted
header with an unknown last part is not a header. The new given tests are
forgery.rs and new versions of memory_args.rs and notes.rs; the old copies
are kept as -task02 and -task06. On a scratch tree at the end of task 17,
the three tests named in the task fail and then pass, four mutations of the
fix are caught, and the gate passes with 939 tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:44 -07:00
kyleandClaude Opus 5.5 53873c82bf M5a spec: no line of an entry or a note may start with §
The M5a review found that a note's text could hold a line shaped like a
notes.md header. Read back, the line started an entry of its own: an
untrusted session could plant a 'moved from memory.md' header, and recall
showed what followed it as identity, not untrusted. Entries and notes now
refuse any line that starts with the separator, and a header must match one
of its three forms exactly.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:44 -07:00
kyleandClaude Opus 5.5 d707be072d M5a plan: tasks 16 and 17, the review's nits
Task 16: memoryd takes the day and the month of a time with str::get, never a
slice. Task 17: repeated error lines in memoryd, proto, brokerd and bxctl
written once. Neither changes behaviour. Both were applied to a scratch tree
from 5f82260: the gate passes with 936 tests, and four mutations of the new
helpers are caught by the existing tests. The README runs with OPENCODE_MODEL.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:44 -07:00
kyleandClaude Opus 5.5 fb65206a6c Implementer log: the Model column filled in as Ornith-1.5-35B-A3B
Every row from M2a to M5a that read ? or Ornith, from the reviews' own
records of who ran each milestone. The DEBUG-HANDOFF row stays ? : no record
says which model it was.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:44 -07:00
kyleandClaude Opus 5.5 fb0aa2e576 Research: chat-template tags in text the model reads; tips I15 and T33; an open decision
M5a task 04 stopped twice on the chat-template tags the check refuses.
The first time, the model read them in a file and took them for its own
template. The second time, it spelled them out in its own reasoning.

Measured on straylight: the think and tool-call tags are one token
whatever the tokenizer's flag. Inside any chat message, the turn
markers become control tokens, so a tool result can forge a system
turn.

Adds the rule to AGENTS.md, and proposes neutralizing the tags in
loopd as an open decision.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:44 -07:00
kyleandClaude Opus 5.5 6f093fcd8e M5a task 15: the starter soul and device checks with memoryd, finished
The session did the task and stopped on make verify-device. The cause
was not the server: run-plan.sh and the device tests both read
BOXMAKER_MODEL, and the run's value (OpenCode's provider-prefixed id)
reached llama-server as the model name. With it unset, verify-device
passes 6 of 6. The copied files are identical to the plan's, and the
gate prints gate: ok, 936 tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:44 -07:00
kyle 9f57cfc381 M5a: the starter soul.md, and the device checks with memoryd running
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle 0a1c206d50 bxctl: reindex, and memory log, undo, pending, accept, reject
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle 15ee4b8e3d loopd: the memory block from memoryd, recall and memory as core tools
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle e167fc871b brokerd: memory calls to memoryd with the session's state; labels only stricter
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle fcfd590687 brokerd: recall and memory, decided under built-in grants
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle 0c8d136c6b memoryd: serve, three sockets and one lock over the files and the index
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle 49af057c81 memoryd: recall, with source tags and the recall log
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle f329d23bd9 memoryd: the FTS5 index over session logs and notes, with labels
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle b1c9d590c8 memoryd: the edit journal, undo of the latest edit, and review
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle b51b320706 memoryd: notes.md, and the five memory actions with routing by trust
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle f5981338b4 memoryd: the memory files, and the block a new session starts with
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle ad5ce5c6e7 memoryd: entries, and the check on every memory write
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyleandClaude Opus 5.5 178484a981 M5a plan, task 04: check.rs given complete; later tests use no tags
Task 04's second session stopped too. It checked its code against the
markup test cases in its reasoning, and the tag it spelled out ended
its reasoning. Building tags from pieces keeps them out of files, not
out of the model's thoughts.

check.rs is now given whole, with the tags from pieces, and task 04
fills only entries.rs. The three later tests that used a tag only as
something the check refuses now use an instruction phrase or an
invisible character. They pass against the reference.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:44 -07:00
kyleandClaude Opus 5.5 8328e8f607 M5a plan, task 04: chat-template tags built from pieces
Task 04's session read the given test and the check.rs skeleton, both
holding the tags the check refuses, and Ornith took them for its own
template. It lost track of the file and made no change. The tags are
now built with concat! and format! in check.rs and in the four given
tests that held them, and the spec describes them in words. The
rewritten tests pass against the reference, are rustfmt-clean, and
still catch the case-folding mutation.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:44 -07:00
kyle b84b9af540 memoryd: the crate, memoryd.toml, and listening on a socket
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:44 -07:00
kyle 964bd99b12 proto: memory, the arguments of recall and memory and eight message kinds
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:35 -07:00
kyle 861ff7d06a brokerd: policy and ledger as modules, before the memory tools
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
2026-09-25 16:41:35 -07:00
kyleandClaude Opus 5.5 41f8329afe nix: a flake that builds every binary, the tool image and a dev shell
Follows the owner's other projects (sift, tether): nixpkgs pinned to
nixos-26.05, x86_64-linux, the version from the commit. `packages.default`
builds all six binaries with rustPlatform (tests stay in `make gate`),
`packages.tools-image` is deploy/tools-image.nix, and `devShells.default`
has Rust 1.95.0, clippy, rustfmt, cargo-deny and make. No NixOS module
yet: that is M8 (P22).

Checked on straylight: `nix flake check` passes; `nix build` gives
brokerd, bxctl, gatewayd, inferproxy, loopd and toolkit, each printing
its usage; `nix build .#tools-image` and `nix develop` work.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:29 -07:00
kyleandClaude Opus 5.5 45f311ecfc Propose P22: a fleet of independent agents, deployed with Nix (M8)
Owner's direction, 2026-09-25: one agent per host, each with its own
identity, memory and credentials, sharing fleet memory through Honcho;
inference from a configured llama-server-compatible endpoint; a last
milestone that deploys to NixOS hosts and other Linux hosts. Not applied
to the brief yet.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 16:41:29 -07:00
kyleandClaude Opus 5.5 0062b2a895 CLAUDE.md: M5a is planned
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 15:33:20 -07:00
kyleandClaude Opus 5.5 de1032157b Plan M5a: local memory in 15 tasks
memoryd (files, the check, edits, journal, index, recall, serving),
the memory tools and built-in grants in brokerd, the memory block in
loopd, bxctl reindex and memory, and the device checks with memoryd.

Each task was built as a reference and gated. Each was replayed on its
own at its end state (854 to 936 tests) and mutation-checked. Each
skeleton compiles and fails its tests. Every todo comment was read
beside its signature.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 15:32:54 -07:00
kyleandClaude Opus 5.5 19fd74db6e M5a spec: details settled while building the reference
The memory socket in brokerd.toml is optional, and bxctl's flag is
--memory-socket. A note's header carries its class. Built-in grants are
kept apart from the owner's, and builtin- ids are reserved. The session
state is carried through Decision and RunSpec, labels through
run_labelled. loopd's assemble_with and MemorySource. Baseline
measured at 881 and 2,432 tokens.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 14:58:33 -07:00
kyleandClaude Opus 5.5 d80b0b3d8a gatewayd: serve_answers waits for every reply it reads
nobody_else_and_nothing_else_answers_it read five replies after
waiting only for the first, so it failed whenever the other four were
not posted yet. It failed once in a full `make gate` run, when many
test binaries ran at once. The helper now waits for as many posts as
the test reads.

The M4b plan's copy is left as it was handed over.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 14:56:58 -07:00
kyleandClaude Opus 5.5 5ffca7a577 M5a spec approved
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:53:02 -07:00
kyleandClaude Opus 5.5 c7f3895c3f Apply P21: identity and experience; memory writes without approval; built-in policy
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:53:02 -07:00
kyleandClaude Opus 5.5 775aa853ed M5a spec: recall hits carry a source tag: identity, memory or memory-tainted
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:51:46 -07:00
kyleandClaude Opus 5.5 0ce3bfc641 Research: prompt-injection defences for persisted memory; the M5a check refuses all default-ignorable code points
The research feeds M5b's sanitizer. One finding is a bug in the M5a
draft: category Cf misses variation selectors, the combining grapheme
joiner, and the Hangul and Braille fillers.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:51:06 -07:00
kyleandClaude Opus 5.5 64a5931354 P21 and the M5a spec: identity and experience; the archive becomes notes, and note is a memory action
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:49:28 -07:00
kyleandClaude Opus 5.5 20bb2ff6fc M5a: the check stays short and fixed; a sanitizer from injection research becomes M5b hardening
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:46:00 -07:00
kyleandClaude Opus 5.5 bb04467001 M5a spec: memory writes are not announced, only journalled; approval syntax noted in the open decision
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:43:55 -07:00
kyleandClaude Opus 5.5 29f9069a33 Propose P21 (memory writes without approval, as in Hermes); revise the M5a spec to match
Writes from sessions that have read untrusted content go to the
archive, labelled untrusted, and never reach the prompt. Every write is
checked, announced in its thread, journalled and can be undone.
Session-scoped approvals for other tools become an open decision.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:41:02 -07:00
kyleandClaude Opus 5.5 817fb9d47f M5a spec: built-in policy for recall and memory; tool calls indexed; output summaries in M5c
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:33:37 -07:00
kyleandClaude Opus 5.5 e86d203740 Draft the M5a spec (local memory); compaction moves to M5c
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:22:08 -07:00
kyleandClaude Opus 5.5 174bdc05b2 CLAUDE.md: memoryd and the M5 split
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:12:38 -07:00
kyleandClaude Opus 5.5 d1c106dd5c Apply P20: M5 splits into M5a (local memory), M5b (Honcho) and M5c (the scheduler)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:12:21 -07:00
kyleandClaude Opus 5.5 774807aa81 Apply P19: recall over the local index and Honcho; trust per workspace
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:12:11 -07:00
kyleandClaude Opus 5.5 9685289242 Apply P18: memoryd, the one owner of memory
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:11:48 -07:00
kyleandClaude Opus 5.5 428b87d31d Apply P17: memory is three files read once per epoch; the memory tool with consolidate
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:11:31 -07:00
kyleandClaude Opus 5.5 85d9519d22 M5 proposals: P19 names no workspace; trust is per workspace, set by the owner
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:07:40 -07:00
kyleandClaude Opus 5.5 71cfe7bb6c M5 proposals: a tiering job in M5c, recall-hit counts from M5a, hermes-fleet trusted; projects as an open decision
The owner's review of 2026-09-24.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:05:04 -07:00
kyleandClaude Opus 5.5 6d36c54ddd M5 proposals: consolidate moves memories to an archive; memoryd owns the memory files and the index
The owner's review of 2026-09-24. P17: the memory tool gains
consolidate, which moves entries out of memory.md into
memory/archive.md, and from M5b into Honcho, instead of losing them.
P18: memoryd owns memory/ and the SQLite index, so every memory tool
runs in one place.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:03:07 -07:00
kyleandClaude Opus 5.5 bb53729950 M5 direction: three memory files, Honcho through memoryd; propose P17 to P20
The owner's direction of 2026-09-24:

- Memory is three local files, as Hermes has them: a soul written by
  the owner, and memory and user files the agent edits.
- Honcho is the fleet's memory. Each Boxmaker writes only to its own
  workspace, and can read other workspaces at a trust level the owner
  sets.
- A new role, memoryd, does the syncing, because brokerd never holds
  conversation history and loopd has no network.
- M5 splits into M5a (files and local search), M5b (memoryd and
  Honcho) and M5c (the scheduler).

The brief is not changed until the owner approves P17 to P20.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 12:48:49 -07:00
kyleandClaude Opus 5.5 a1d5083bd5 CLAUDE.md: M4b is done and merged; branches land by rebase
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 12:31:12 -07:00
kyleandClaude Opus 5.5 ddb459a631 M4b: the redirect checked on the owner's server; finding 1 closed
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 12:29:02 -07:00