AssetPostprocessor: How to persist changes to a model

I’m adding a submesh to a model in AssetPostprocessor.OnPostprocessAllAssets, and then building a prefab from it with PrefabUtility.CreatePrefab.

It works fine until I restart the editor, and then the changes to the model are shown to have been ephemeral; neither it nor the prefab retain the new submesh.

What’s the trick to making lasting changes to a model, or at least saving a new mesh?

static def OnPostprocessAllAssets(  imported as (string),
                                    deleted as (string),
                                    moved as (string),
                                    movedFromAssetPath as (string) ):
   for assetName in imported:
      if assetName.EndsWith('Ship.obj'):
         modelName = assetName.Replace('.obj', '').Replace('Assets/models/', '')

         mesh = AssetDatabase.LoadAssetAtPath( assetName, Mesh )
         BuildWireFrame( mesh )

         go = GameObject( modelName )
         mf = go.AddComponent[of MeshFilter]()
         mf.sharedMesh = mesh

         renderer = go.AddComponent[of MeshRenderer]()
         renderer.materials = (
            AssetDatabase.LoadAssetAtPath( 'Assets/materials/RimLight.mat', Material ),
            AssetDatabase.LoadAssetAtPath( 'Assets/materials/WireFrame.mat', Material )
         )

         PrefabUtility.CreatePrefab( "Assets/prefabs/" + modelName + ".prefab", go )
         EditorApplication.SaveAssets()
         EditorApplication.SaveScene()

         GameObject.DestroyImmediate( go )

I’d still like to know if a model can be permanently modified, but cloning the mesh and saving it to the AssetDatabase works.

original as Mesh = AssetDatabase.LoadAssetAtPath( assetName, Mesh )

//  clone
mesh = Mesh()
mesh.vertices = original.vertices
mesh.triangles = original.triangles
mesh.normals = original.normals
mesh.uv = original.uv

//  modify clone
BuildWire( mesh )

modelName = assetName.Replace('.obj', '').Replace('Assets/models/', '')
meshAssetPath = "Assets/meshes/${modelName}Mesh.asset"

//  save
AssetDatabase.CreateAsset( mesh, meshAssetPath )

//  reimport
mesh = AssetDatabase.LoadAssetAtPath( meshAssetPath, Mesh )

//  use
go = GameObject( modelName )
mf = go.AddComponent[of MeshFilter]()
mf.sharedMesh = mesh

renderer = go.AddComponent[of MeshRenderer]()
renderer.materials = (
    AssetDatabase.LoadAssetAtPath( 'Assets/materials/Rim.mat', Material ),
    AssetDatabase.LoadAssetAtPath( 'Assets/materials/Wire.mat', Material )
)

PrefabUtility.CreatePrefab( "Assets/prefabs/" + modelName + ".prefab", go )

AssetDatabase.Refresh()
EditorApplication.SaveAssets()
EditorApplication.SaveScene( EditorApplication.currentScene )

GameObject.DestroyImmediate( go )