Files
boxmaker/docs/plans/M5a/04-memoryd-entries-check.md
T
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

2.4 KiB

M5a task 04: entries and the check

Branch: m5a (run git switch m5a; git status --short must be empty, otherwise stop) Commit subject: memoryd: entries, and the check on every memory write

Goal

Two small modules (M5a spec, section 3 and section 5, "The check"):

  • entries: memory.md and user.md are entries separated by a line holding only §. Parse, render, and measure a file in characters.
  • check: every entry the agent writes, and every identity entry going into the prompt, is refused if it holds a control character (other than newline and tab), an invisible or direction-changing character, chat-template markup, or one of six instruction phrases. The table of invisible characters is written in the skeleton, from Unicode 16's Default_Ignorable_Code_Point property, plus six more.

Files

  • Copy (skeletons): crates/memoryd/src/entries.rs, crates/memoryd/src/check.rs
  • Copy (tests): crates/memoryd/tests/entries.rs, crates/memoryd/tests/check.rs
  • Modify: crates/memoryd/src/lib.rs, docs/implementer-log.md

The edits, exactly

crates/memoryd/src/lib.rs: add pub mod check; before pub mod config;, and pub mod entries; after it. The file then lists check, config, entries, socket.

The skeletons

entries.rs: fill parse, push, render, size. check.rs: Refused and its sentences, DEFAULT_IGNORABLE, ALSO_INVISIBLE, MARKUP and PHRASES are written; fill invisible and check. Do not change the tables.

Markup in this code. MARKUP and the test build the chat-template tags from pieces (concat!("<", "think"), format!("{LT}think>")), so that no file holds a tag literally. Keep it that way: do not write a tag out whole in code, a comment, a command or your log. When you need to name one, say "the opening think tag".

Steps

  • 1. Copy the four files; edit lib.rs.
  • 2. See it fail. cargo test -p memoryd --test entries --test check: entries 3 failed, check 6 failed.
  • 3. Fill the six functions. cargo fmt --all.
  • 4. See it pass. The same command: 3 and 6 passed.
  • 5. Run the gate. make gate: gate: ok, 9 more tests than before (about 877).
  • 6. Log and commit. git add -A crates/memoryd docs/implementer-log.md Cargo.lock && git commit

Done when

  • make gate prints gate: ok.

Stop and report if

  • A test fails after the functions follow their comments exactly.