Why a Moved Conversation Actually Filters Now
The honest story of a folder filter that looked finished but had no data model behind it for months, and the join table that finally made it real.
Not every feature story is about something new. Some of the more useful ones are about something that looked done, wasn't, and eventually got fixed properly — and this is one of those, worth telling plainly rather than quietly.
What was actually happening
For months, the conversation rail in ai-agent had a "Projects" section, and it always showed zero. Selecting a folder filter always returned an empty list, no matter how many conversations you'd apparently moved into it. The reason turned out to be structural, not cosmetic: every thread's folder_id was hardcoded to null in both the route that created threads and the route that read them back, and the underlying ai_agent_folders table had no membership or join structure connecting a thread to a folder at all. The UI to assign a thread to a folder never existed either. The filter wasn't broken — it was never wired to anything in the first place. It just looked like a working feature because the rail rendered correctly and the folders existed; it just had nothing real behind the count.
What actually fixed it
The real fix was a dedicated join table connecting threads to folders — a proper many-relationship structure, not a patch on the existing hardcoded null. One detail in that table is worth calling out specifically: the user id is part of the table's primary key, not just an incidental column. That's a deliberate protection against one account being able to claim a thread id that belongs to someone else — the kind of subtle cross-account bug that's easy to introduce when you're rebuilding a feature under time pressure and easy to miss in review if you're not looking for it specifically.
Why this is worth telling, not hiding
It would be simpler, from a marketing standpoint, to just quietly ship the fix and never mention that the feature didn't work for months. But a platform that only ever talks about what's shiny and never about what was actually broken and how it got fixed properly is harder to trust on the things it hasn't told you about yet. The honest version of this story — a UI feature that existed with zero backing data model, discovered, and rebuilt with a real join table and a real tenancy protection baked in — says more about how bugs get found and fixed here than any feature announcement would.
The practical upshot
If you use folders to organize agent conversations, that filtering now does what it always looked like it should do — conversations you move into a folder actually show up when you filter to it, backed by a real relationship in the database rather than a UI element with nothing behind it. If you noticed the "always empty" behavior before and gave up on using folders, it's worth trying again.