execution frame carry a lineage id

This commit is contained in:
lda
2026-05-24 22:51:12 +07:00 Verified
parent 4576127d09
commit e48656c165
7 changed files with 236 additions and 3 deletions
+17
View File
@@ -81,6 +81,7 @@ def _step_foreach_serial(
barrier.next_index = loop_index + 1
barrier.save_to_frame(frame, step.id)
child_id = f"{frame.id}:{step.id}:{loop_index}"
child_lineage_id = _child_lineage_id(frame, step, loop_index)
add_frame(
run,
ExecutionFrame(
@@ -89,6 +90,9 @@ def _step_foreach_serial(
node_id=loop_start,
status=FrameStatus.PENDING,
parent_frame_id=frame.id,
scope_id=frame.scope_id,
lineage_id=child_lineage_id,
parent_lineage_id=frame.lineage_id,
metadata=ForeachIterationMetadata(
foreach_node_id=step.id,
loop_index=loop_index,
@@ -243,6 +247,7 @@ def _admit_concurrent_children(
loop_index = barrier.next_index
item = iterable[loop_index]
child_id = f"{frame.id}:{step.id}:{loop_index}"
child_lineage_id = _child_lineage_id(frame, step, loop_index)
active_count = len(barrier.active_frame_ids)
barrier.next_index = loop_index + 1
barrier.start_child(child_id)
@@ -254,6 +259,9 @@ def _admit_concurrent_children(
node_id=loop_start,
status=FrameStatus.PENDING,
parent_frame_id=frame.id,
scope_id=frame.scope_id,
lineage_id=child_lineage_id,
parent_lineage_id=frame.lineage_id,
metadata=ForeachIterationMetadata(
foreach_node_id=step.id,
loop_index=loop_index,
@@ -344,3 +352,12 @@ def _finish_concurrent_foreach(
)
advance_frame(run, frame, outcome=outcome, next_node_id=next_node_id)
return run
def _child_lineage_id(frame: ExecutionFrame, step: ForeachNode, loop_index: int) -> str:
"""Return a deterministic opaque lineage id for one foreach child frame.
The readable shape is only for diagnostics. Runtime code should compare the
full id, not parse it; future structured lineage refs can replace this.
"""
return f"{frame.lineage_id}/{step.id}[{loop_index}]"
+3
View File
@@ -7,6 +7,9 @@ def frame_context_values(frame: ExecutionFrame) -> dict[str, object | None]:
context: dict[str, object | None] = {
"prior_outcome": frame.prior_outcome,
"activated_incoming_edge": frame.activated_incoming_edge,
"scope_id": frame.scope_id,
"lineage_id": frame.lineage_id,
"parent_lineage_id": frame.parent_lineage_id,
}
if frame.kind == "foreach_iteration":
loop_item = frame.metadata.get("loop_item")
+4
View File
@@ -79,6 +79,9 @@ def _resolve_node_execution(
context = RuntimeContext(
current_node_id=node.id,
frame_id=frame.id,
scope_id=frame.scope_id,
lineage_id=frame.lineage_id,
parent_lineage_id=frame.parent_lineage_id,
prior_outcome=frame.prior_outcome,
activated_incoming_edge=frame.activated_incoming_edge,
metadata=dict(frame.metadata),
@@ -127,6 +130,7 @@ def _finalize_node_execution(
index=item_index,
frame_id=frame.id,
patch=patch,
lineage_id=frame.lineage_id,
)
barrier.save_to_frame(parent_frame, foreach_node_id)
state_changes = {}