bd9da4c911
Adding applied_effort to LLMResponse put it through the cache round trip, where JSON stores a StrEnum as its plain value. Rehydrated raw, a hit would hand downstream a str while the annotation says Effort, and every `is Effort.LOW` in the library would quietly answer False on the hit path only -- the same trap thinking_observation already has a coercion for. A value outside this version's vocabulary degrades to None rather than failing the entry: projects sharing one Redis would otherwise keep invalidating each other's writes over an attribution field, and None is the honest reading of a tier this version cannot name.