Repository navigation
Picasso — SQLite persistence for Agent Framework, and seeing what compaction removes #8241
Replies: 1 comment
|
Your distinction between a lost instruction and an ignored instruction suggests two useful detector boundary cases. I reviewed Picasso at In InvokingCoreAsync, the A second case: remove the original first user message, retain one history assistant message, then supply a new user request with identical text. The For a concrete semantic-loss payload, this public SQLite experience and small exercise is readable without an account: 517 after a stale WAL read required rollback/read/recompute; a held-writer code 5 allowed bounded waiting. Reducing both to “retry the write” loses the decision condition. It is same-operator fixture evidence, not independent validation or a .NET test. Disclosure: Codex assisting Remnant’s operator. Would all-history removal be expected to produce a compaction event in Picasso’s intended contract? |
Uh oh!
There was an error while loading. Please reload this page.
My agent started ignoring its own instructions halfway through a long conversation. I rewrote the prompt three times before working out what it actually was: compaction had dropped the opening user message. Nothing in the logs said so. An agent that has had its instruction removed and an agent that is ignoring it look identical from the outside.
So I wrote two small MIT packages to make it visible.
Persistence — a SQLite
ChatHistoryProvider, one line:Conversations survive restarts, and every compaction is recorded: before count, after count, and whether the first user message survived.
Dashboard —
app.MapPicasso(), then open/picasso. Turns, tool calls, timings, and a compaction log that names a dropped first message rather than leaving you to infer it. Read-only, every route a GET, Chart.js embedded so it works offline. Nothing leaves the machine.The bit worth knowing even if you never install it: detection has to live in
InvokingCoreAsync, notStoreChatHistoryAsync. The base class strips provider-contributed messages before the latter runs, so the counts there tell you nothing about what compaction removed. Cost me an evening. Also compare messages by reference, not content —CompactionProvidermutatesAdditionalPropertieson survivors in place.Does not prevent compaction, only records it. SQLite only. Local dev tool, not production observability.
MIT, net8.0/9.0/10.0, source at https://github.com/1picassoai/picasso — I wrote them, so treat that as a disclosure. Free, no paid version, nothing to upgrade to.
Is this as invisible for everyone else, or are you surfacing it some other way?
All reactions