Thank you for Understory. "Conformance is enforced in code, not prompts" is the reason we trusted it with a delete-authorised dreaming agent over a real corpus at all, and this report is offered in that spirit: one more place where the code layer could hold the line for the model.
Summary. writeConcept / patchConcept accept whatever frontmatter the agent hands them. With a local model (Qwen3.8-27B) the agent regularly writes description: as a YAML mapping instead of a string, and once wrote its own tool's entire JSON Schema there. The indexer then renders the concept with no description, the graph shows it as missing, and the next mutation on that concept tends to repeat the mistake.
Measured. Over one long document ingested as 58 chapter continuations: 41 of 55 rewrites wrote the description back as a mapping; 45 frontmatter keys in 36 concepts had to be lifted back to strings by hand with the server stopped, seven of them a second time. Separately, the agent looped nine times in one minute on "Updated the description of Chapter 18", each time rewriting the schema it had written itself.
Suggestion. The deterministic bundle layer already validates type, regenerates index.md and appends log.md. description and title deserve the same: reject a non-string before the file is written and return a tool error the agent can act on. That single check would have prevented every one of the 41 corruptions and, we suspect, the loop.
Smaller ask. A guard against N identical mutation subjects in a row (we saw nine in a minute) would turn a loop into one failure with a message instead of nine commits.
Happy to test a fix against the corpus that produced these numbers, or to help with a PR if that is useful.
Transparency note. I am a fan of this project and want to help, so I want to be clear about how this was produced. I run Understory pinned by digest as the memory layer of a personal knowledge-capture project (a private repo) on my own hardware. The measurements come from that project's instrumentation: every memory_add is timed and then checked against the bundle by content. The review of the open pull-request queue that led to these posts, and the drafting of the text, were done with an AI assistant (Claude, via Claude Code) working against the actual diffs and my deployment. I read, corrected and approved every word before posting, and the numbers were re-checked against my records; two earlier claims were dropped as wrong before anything was posted. We also run a derived image (git plus safe.directory and committer identity, an undici preload with a 30-minute headers timeout, and a git init entrypoint), which is why #26 and #32 matter to us directly. No employer data or systems are involved. If any of this is unwelcome in your tracker, say so and I will adjust or withdraw it.
Thank you for Understory. "Conformance is enforced in code, not prompts" is the reason we trusted it with a delete-authorised dreaming agent over a real corpus at all, and this report is offered in that spirit: one more place where the code layer could hold the line for the model.
Summary.
writeConcept/patchConceptaccept whatever frontmatter the agent hands them. With a local model (Qwen3.8-27B) the agent regularly writesdescription:as a YAML mapping instead of a string, and once wrote its own tool's entire JSON Schema there. The indexer then renders the concept with no description, the graph shows it as missing, and the next mutation on that concept tends to repeat the mistake.Measured. Over one long document ingested as 58 chapter continuations: 41 of 55 rewrites wrote the description back as a mapping; 45 frontmatter keys in 36 concepts had to be lifted back to strings by hand with the server stopped, seven of them a second time. Separately, the agent looped nine times in one minute on "Updated the description of Chapter 18", each time rewriting the schema it had written itself.
Suggestion. The deterministic bundle layer already validates
type, regeneratesindex.mdand appendslog.md.descriptionandtitledeserve the same: reject a non-string before the file is written and return a tool error the agent can act on. That single check would have prevented every one of the 41 corruptions and, we suspect, the loop.Smaller ask. A guard against N identical mutation subjects in a row (we saw nine in a minute) would turn a loop into one failure with a message instead of nine commits.
Happy to test a fix against the corpus that produced these numbers, or to help with a PR if that is useful.
Transparency note. I am a fan of this project and want to help, so I want to be clear about how this was produced. I run Understory pinned by digest as the memory layer of a personal knowledge-capture project (a private repo) on my own hardware. The measurements come from that project's instrumentation: every
memory_addis timed and then checked against the bundle by content. The review of the open pull-request queue that led to these posts, and the drafting of the text, were done with an AI assistant (Claude, via Claude Code) working against the actual diffs and my deployment. I read, corrected and approved every word before posting, and the numbers were re-checked against my records; two earlier claims were dropped as wrong before anything was posted. We also run a derived image (git plussafe.directoryand committer identity, an undici preload with a 30-minute headers timeout, and agit initentrypoint), which is why #26 and #32 matter to us directly. No employer data or systems are involved. If any of this is unwelcome in your tracker, say so and I will adjust or withdraw it.