46f559f5f9
Equipment tags resolved at runtime via FocasEquipmentTagParser were not seeded in _parsedAddressesByTagName so both ReadAsync and WriteAsync re-parsed the raw TagConfig JSON address string on every hot-path call. Promoted the field to ConcurrentDictionary (read + write thread safety) and introduced ResolveParsedAddress(GetOrAdd) so the first call stores the parse result and all subsequent calls are a cache hit. Authored tags seeded at InitializeAsync compile and work unchanged.