Is computeVertexNormals working correctly?

For special geometries, you should always calculate the normals yourself.
However, I sometimes use .computeVertexNormals( ) when only a few changes are needed afterwards.

From the Collection of examples from discourse.threejs.org : MultiFormGeometry
see
view-source:https://hofk.de/main/discourse.threejs/2022/MultiFormGeometry/multiFormGeometryStatic.js

line 473

       g.computeVertexNormals( );
        
        // calculate new average normals at seam ( smooth shading )
        
        for ( let i = 0; i < hss; i ++ ) { // height
            
            smoothEdge( rss * i, rss * i + rs );
            
        }
        
        if( wb ) {  // calculate new average normals at bottom  ( smooth shading )
        
            for( let j = 0; j < rss ; j ++ ) { // bottom
                
                smoothEdge( j, rss * hss + 1 + j );
                
            }
            
        }
        
        if( wt ) {  // calculate new average normals at top ( smooth shading )
        
            for( let j = 0; j < rss ; j ++ ) { // top
                
                smoothEdge( rss * hs + j, rss * hss + rss + 2 + j );
                
            }
        }

       function smoothEdge( idxa, idxb ) {
            
            const v3a = new THREE.Vector3( );
            const v3b = new THREE.Vector3( );
            const v3  = new THREE.Vector3( );
            
            v3a.set( g.attributes.normal.getX( idxa ), g.attributes.normal.getY( idxa ), g.attributes.normal.getZ( idxa ) );
            v3b.set( g.attributes.normal.getX( idxb ), g.attributes.normal.getY( idxb ), g.attributes.normal.getZ( idxb ) );
            
            v3.addVectors( v3a, v3b ).normalize( );
            
            g.attributes.normal.setXYZ( idxa, v3.x, v3.y, v3.z );
            g.attributes.normal.setXYZ( idxb, v3.x, v3.y, v3.z );
            
        }

see also Curved2Geometry