Skip to content

Write path accepts a non-string description; local models regularly write a mapping (or a JSON Schema) and the concept loses its description #33

Description

@Ringosystems

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions