clean-greece-29346
09/01/2026, 1:02 PMConversationState and StoredConversation? I've been running into some friction while working on the new endpoints for conversation tags, but there are at least two latent bugs lurking right now:
confirmation_policy, security_analyzer, and secrets are all tracked by both stores and read from stored on startup (e.g. lines 1090–1102 of event_service.py), but API mutations only write to ConversationState. That means those changes are silently lost on conversation eviction or server restart. tags (what my PR addresses) is actually the only field where the API correctly keeps both stores in sync.
Is this a known gap? And more broadly, is there a design doc or shared understanding of which store is authoritative for which fields? The current behavior looks like it accreted field by field rather than following a deliberate boundary.calm-artist-7206
09/01/2026, 2:28 PMConversationState should be the only one in use for the fields that belong in it
• IOW, those fields shouldn’t be duplicated elsewherecalm-artist-7206
09/01/2026, 2:30 PMcalm-artist-7206
09/01/2026, 2:31 PMclean-greece-29346
09/01/2026, 2:47 PMconfirmation_policy, security_analyzer, and secrets out of StoredConversation . but what about tags?clean-greece-29346
09/01/2026, 2:50 PMstored when building listing/search results, so if they move to ConversationState only, every tag-based query would have to deserialize each conversation's base_state.json — which is what meta.json was designed to avoid. Is a cached projection in StoredConversation acceptable (source of truth in ConversationState, derived copy in meta.json for listing), or should the listing use case be handled a different way? Sent using @kind-afternoon-35376calm-artist-7206
09/01/2026, 2:57 PMConversationState and they’re about lists of conversations - those belong in meta.json
Not sure, but maybe this should be the case of tags?calm-artist-7206
09/01/2026, 2:58 PMupdated_atclean-greece-29346
09/01/2026, 2:58 PMmeta.jsonclean-greece-29346
09/01/2026, 2:59 PMcalm-artist-7206
09/01/2026, 2:59 PMclean-greece-29346
09/01/2026, 2:59 PMcalm-artist-7206
09/01/2026, 3:01 PMcalm-artist-7206
09/01/2026, 3:02 PMclean-greece-29346
09/01/2026, 3:06 PMstate.tags in the SDK — two internal paths depend on it:
1. Observability (base.py:172) — tags are forwarded to the observability span as conversation.tags.{key} attributes at conversation start
2. Fork (local_conversation.py:878) — when forking with a title, the title is written into the forked conversation's _state.tags by merging it in
Neither is a public-facing API, so no external breaking change, but both would need updating if tags move out of ConversationState. The fork one in particular is a bit odd anyway — it sets a title by injecting it into the tags dict, which might be worth cleaning up regardless. Sent using @kind-afternoon-35376calm-artist-7206
09/01/2026, 3:08 PMclean-greece-29346
09/01/2026, 3:09 PMclean-greece-29346
09/01/2026, 3:10 PMclean-greece-29346
09/01/2026, 3:14 PMConversationState entirely — it probably needs a more considered solution. Happy to dig into that separately. The fork quirk we can fix independently regardless. Sent using @kind-afternoon-35376clean-greece-29346
09/01/2026, 3:21 PMcalm-artist-7206
09/01/2026, 3:21 PMcalm-artist-7206
09/01/2026, 3:21 PMcalm-artist-7206
09/01/2026, 3:21 PMclean-greece-29346
09/01/2026, 3:21 PMcalm-artist-7206
09/01/2026, 3:23 PMcalm-artist-7206
09/01/2026, 3:23 PMclean-greece-29346
09/01/2026, 3:30 PMcalm-artist-7206
09/01/2026, 3:32 PMclean-greece-29346
09/01/2026, 3:35 PMcalm-artist-7206
09/01/2026, 3:35 PMclean-greece-29346
09/01/2026, 3:39 PMclean-greece-29346
09/01/2026, 3:40 PMclean-greece-29346
09/01/2026, 7:53 PMconfirmation_policy, security_analyzer, secrets in StoredConversation with Field(exclude=True) so they're never written to meta.json, and fixed update_secrets to trigger autosave. But I want to check — when you said "those fields shouldn't be duplicated elsewhere", did you mean they also shouldn't exist on StoredConversation in memory at all (i.e. removed from ConversationConfig and only on StartConversationRequest)? We looked at that and ran into the fork path and telemetry helper both reading from stored, plus a CODEX credential injection pattern that needs stored.secrets before ConversationState is loaded. Happy to go further if that's the intent, just wanted to confirm before we commit to the approach. Sent using @kind-afternoon-35376calm-artist-7206
09/01/2026, 7:59 PMclean-greece-29346
09/01/2026, 8:00 PMclean-greece-29346
09/01/2026, 8:07 PMlimited-student-10747
09/02/2026, 2:02 AMclean-greece-29346
09/02/2026, 2:13 PM