M5a plan: tasks 21 and 22, from the device check

21: the ledger raises a session's state by the stricter of the grant's
label and the result's own, so a clean session that recalls a
memory-tainted note becomes untrusted and cannot write it into
memory.md (found on straylight, 2026-09-25). 22: the answers to a note
name notes.md, and for an untrusted add the file that was not changed.
The new given tests are ledger_label.rs and new versions of memoryd's
edit.rs and serve.rs; the old copies are kept as -task06 and -task10. On
a scratch tree at the end of task 20: the named tests fail and then pass,
5 and 4 mutations are caught, and the gate passes with 944 tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-25 17:55:41 -07:00
co-authored by Claude Opus 5.5
parent f025c811c0
commit f389a9a43a
8 changed files with 1012 additions and 9 deletions
@@ -175,7 +175,7 @@ fn an_untrusted_session_writes_notes_not_identity() {
));
assert_eq!(
answer,
"saved as a note (untrusted): this session has read untrusted content"
"not added to memory.md: this session has read untrusted content, so it was saved in notes.md as an untrusted note"
);
let memory = std::fs::read_to_string(r.dir.path().join("memory/memory.md")).unwrap();
assert_eq!(memory, "");
@@ -232,7 +232,7 @@ fn review_holds_identity_writes_but_not_notes() {
r#"{"action":"note","text":"Not held."}"#,
false,
));
assert_eq!(noted, "noted");
assert_eq!(noted, "saved in notes.md");
let (untrusted, _) = content(call(
&r,
"mm-b",
@@ -242,7 +242,7 @@ fn review_holds_identity_writes_but_not_notes() {
));
assert_eq!(
untrusted,
"saved as a note (untrusted): this session has read untrusted content"
"not added to memory.md: this session has read untrusted content, so it was saved in notes.md as an untrusted note"
);
let admin = |command, arg: &str| match ask(
&r.config.admin_socket(),