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
06fe8209f98ab3db0ba8d868e648d5cd5c7c71d4Parent: 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-cospan2 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 }