Skip to content

Conversation

@pedroigorjs
Copy link
Contributor

@pedroigorjs pedroigorjs commented Dec 5, 2025

This pull request introduces enhancements to execution tracking and output normalization in the retrack engine. The main changes add support for node aliases, improve serialization of execution data, and introduce a utility for DataFrame normalization. These updates make execution outputs more readable and structured, and provide better context through node aliases.

Execution Tracking and Serialization Improvements:

  • Added an aliases attribute to the Execution class, along with methods to set and store node aliases during execution. This allows each node's output to be associated with a human-readable alias.
  • Implemented the to_normalized_dict method in Execution, which serializes inputs, outputs, child executions, and results into a normalized dictionary format for easier downstream processing and inspection.

Node Alias Support:

  • Added an alias() method to the BaseNode class, which returns a node's alias if available, falling back to its name. This ensures consistent alias retrieval for execution tracking.

Utility Functions:

  • Added the to_normalized_dict function in retrack/utils/transformers.py to convert DataFrame columns into a list of dictionaries with names and values, supporting the new serialization logic.

@pedroigorjs pedroigorjs self-assigned this Dec 5, 2025
@pedroigorjs pedroigorjs added the enhancement New feature or request label Dec 5, 2025
Base automatically changed from f/add-flow-v0-child-executions to main January 7, 2026 12:35
@pedroigorjs pedroigorjs marked this pull request as ready for review January 15, 2026 16:45
@pedroigorjs pedroigorjs changed the title [WIP] Improve Execution Serialization Improve Execution Serialization Jan 15, 2026
@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py872769%43, 115–194, 203, 210, 213
   executor.py1301092%62, 74–75, 159, 227, 273, 291, 295, 307, 320
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py51296%104, 111
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28389%106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py231535%15, 49–79
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL147411592% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 3.827s ⏱️

@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py872769%43, 115–194, 203, 210, 213
   executor.py1301092%62, 74–75, 159, 227, 273, 291, 295, 307, 320
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py51296%104, 111
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28582%17–18, 106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py231535%15, 49–79
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL147411792% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 5.318s ⏱️

@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py711086%49, 121–148, 152, 159, 162
   executor.py1301092%62, 74–75, 159, 227, 273, 291, 295, 307, 320
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py53394%104, 111, 114
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28582%17–18, 106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py12611310%16, 24–39, 63–111, 128–186, 200–302, 333–363
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL156319987% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 5.038s ⏱️

@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py711086%49, 121–148, 152, 159, 162
   executor.py1301092%62, 74–75, 159, 227, 273, 291, 295, 307, 320
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py53394%104, 111, 114
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28389%106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py12611310%16, 24–39, 63–111, 128–186, 200–302, 333–363
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL156319787% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 3.932s ⏱️

@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py711086%49, 121–148, 152, 159, 162
   executor.py1301092%62, 74–75, 159, 227, 273, 291, 295, 307, 320
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py53394%104, 111, 114
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28582%17–18, 106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py1099810%16–31, 55–103, 120–178, 192–294
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL154618488% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 5.268s ⏱️

@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py711086%49, 121–148, 152, 159, 162
   executor.py1301092%62, 74–75, 159, 227, 273, 291, 295, 307, 320
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py53394%104, 111, 114
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28389%106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py1099810%16–31, 55–103, 120–178, 192–294
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL154618288% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 3.961s ⏱️

@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py711086%49, 121–148, 152, 159, 162
   executor.py1301092%62, 74–75, 159, 227, 273, 291, 295, 307, 320
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py53394%104, 111, 114
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28582%17–18, 106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py13011412%11, 15–18, 23, 35–50, 74–122, 139–197, 213–325
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL156720087% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 4.903s ⏱️

@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py711086%49, 121–148, 152, 159, 162
   executor.py1301092%62, 74–75, 159, 227, 273, 291, 295, 307, 320
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py53394%104, 111, 114
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28389%106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py13011412%11, 15–18, 23, 35–50, 74–122, 139–197, 213–325
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL156719887% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 3.924s ⏱️

@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py711086%49, 121–148, 152, 159, 162
   executor.py1311092%62, 74–75, 157, 228, 274, 292, 296, 308, 321
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py53394%104, 111, 114
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28582%17–18, 106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py13011412%11, 15–18, 23, 35–50, 74–122, 139–197, 213–325
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL156820087% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 5.008s ⏱️

@github-actions
Copy link

coverage

Coverage Report
FileStmtsMissCoverMissing
retrack/engine
   base.py711086%49, 121–148, 152, 159, 162
   executor.py1311092%62, 74–75, 157, 228, 274, 292, 296, 308, 321
   request_manager.py67790%17, 36, 55, 70–71, 154, 157
   rule.py50394%87, 109, 116
retrack/nodes
   base.py53394%104, 111, 114
   check.py41393%23, 26, 89
   constants.py92397%122, 125, 170
   math.py43198%75
retrack/nodes/dynamic
   base.py16194%26
   csv_table.py43295%59, 62
   flow.py44198%18
retrack/utils
   component_registry.py1051883%77–78, 81–82, 85–86, 91–92, 101, 112–123
   exceptions.py28389%106–127
   graph.py60788%35, 46, 59, 61, 63, 84, 86
   registry.py34682%23–26, 38, 43, 51
   transformers.py13011412%11, 15–18, 23, 35–50, 74–122, 139–197, 213–325
retrack/validators
   base.py4175%14
   node_exists.py15287%36, 38
   node_validator.py33391%31, 56–57
TOTAL156819887% 

Tests Skipped Failures Errors Time
91 0 💤 0 ❌ 0 🔥 3.930s ⏱️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants