fix: key field transforms by source vertex for cross-schema morphisms lift_wtype_sigma looks up field_transforms by child_node.anchor (the source vertex name) before remapping. But tangled_transforms and db_transforms were keyed by the Cospan (target) vertex name, so transforms like at_uri_extract_did were never applied. Remap transform keys from target → source using the migration's reverse vertex_map, so panproto's expression language correctly decomposes AT-URIs into repo_did/repo_name for Tangled issues/pulls.

Author: Aaron Steven White
Commit 06fe8209f98ab3db0ba8d868e648d5cd5c7c71d4
Parent: a8e2dd421f
Structural diff unavailable

These commits were pushed via plain git push, so no pre-parsed schemas are available. Install git-remote-cospan and re-push via panproto:// to see scope-level changes, breaking change detection, and semantic diffs.

brew install panproto/tap/git-remote-cospan
2 files changed +23 -16
@@ -147,18 +147,7 @@ impl RecordTransformer {
147147         record: &serde_json::Value,
148148     ) -> Option<Result<serde_json::Value>> {
149149         let morphism = self.tangled_morphisms.get(tangled_nsid)?;
150-        let result = apply_morphism(morphism, record);
151-        if let Ok(ref json) = result {
152-            tracing::debug!(
153-                tangled = tangled_nsid,
154-                cospan = %morphism.cospan_nsid,
155-                has_repo_did = json.get("repoDid").is_some(),
156-                has_repo = json.get("repo").is_some(),
157-                keys = ?json.as_object().map(|o| o.keys().collect::<Vec<_>>()),
158-                "tangled transform output"
159-            );
160-        }
161-        Some(result)
150+        Some(apply_morphism(morphism, record))
162151     }
163152 }
164153 
@@ -536,23 +536,41 @@ fn compile_one(
536536     let mut compiled = panproto_mig::compile(&tangled_schema, &cospan_schema, &migration)
537537         .map_err(|e| anyhow::anyhow!("compile: {e:?}"))?;
538538 
539+    // Field transforms must be keyed by SOURCE (Tangled) vertex names because
540+    // lift_wtype_sigma looks them up by `child_node.anchor` before remapping.
541+    // Both tangled_transforms and db_transforms return Cospan vertex keys,
542+    // so we remap them to the corresponding Tangled source vertex.
543+    let reverse_vertex_map: HashMap<Name, Name> = migration
544+        .vertex_map
545+        .iter()
546+        .map(|(src, tgt)| (tgt.clone(), src.clone()))
547+        .collect();
548+
539549     // Inject Tangled-specific field transforms (type coercions, semantic mappings)
540550     let tangled_transforms =
541551         crate::db_projection::tangled_transforms(m.tangled_nsid, m.cospan_nsid);
542-    for (vertex, transforms) in tangled_transforms {
552+    for (cospan_vertex, transforms) in tangled_transforms {
553+        let key = reverse_vertex_map
554+            .get(&cospan_vertex)
555+            .cloned()
556+            .unwrap_or(cospan_vertex);
543557         compiled
544558             .field_transforms
545-            .entry(vertex)
559+            .entry(key)
546560             .or_default()
547561             .extend(transforms);
548562     }
549563 
550564     // Inject DB projection field transforms (AT-URI decomposition, renames, etc.)
551565     let db_transforms = crate::db_projection::db_transforms(m.cospan_nsid);
552-    for (vertex, transforms) in db_transforms {
566+    for (cospan_vertex, transforms) in db_transforms {
567+        let key = reverse_vertex_map
568+            .get(&cospan_vertex)
569+            .cloned()
570+            .unwrap_or(cospan_vertex);
553571         compiled
554572             .field_transforms
555-            .entry(vertex)
573+            .entry(key)
556574             .or_default()
557575             .extend(transforms);
558576     }
cospan · schematic version control on atproto built on AT Protocol