feat: cache detection result