feat(commons): FlowGraphBuilder folds outbound lifecycles into one node; async/spawn edges; Response from the inbound execution

Fold rule: outbound rows sharing (kind, CorrelationId) become one FlowStep with
a Lifecycle list — first row's identity/time/input, latest row's outcome/
subtitle/output/error, DurationMs = sync row's own or submit→terminal wall time
(null while pending). Chain skips async steps (Notify, or first row
CachedSubmit) and links them with Async edges from the preceding chain step.
Spawner edges from a non-RouteCall are Spawn: true. The Response links from the
last non-async step of the inbound execution (the RouteCall), not the globally
last cascaded step (D9). FlowGraphView places a Response at max column + 1 so
the D9 origin does not pull it left (pulled forward from Task 7 to keep the
layout test green).

Claude-Session: https://claude.ai/code/session_01NcMG6xXdsJbmD2wYAgkK29
This commit is contained in:
Joseph Doherty
2026-09-06 01:42:48 -04:00
parent e26616bebc
commit 29129ef17a
5 changed files with 332 additions and 23 deletions
@@ -9,7 +9,7 @@
{
"id": 1,
"subject": "Task 1: Commons \u2014 FlowStepProjector maps outbound rows",
"status": "in_progress",
"status": "completed",
"blockedBy": [
0
]
@@ -17,7 +17,7 @@
{
"id": 2,
"subject": "Task 2: Commons \u2014 FlowGraphBuilder groups operations, async branches, spawn edges, Response origin",
"status": "pending",
"status": "in_progress",
"blockedBy": [
0,
1
@@ -96,5 +96,5 @@
]
}
],
"lastUpdated": "2026-09-06T05:37:29.919766+00:00"
"lastUpdated": "2026-09-06T05:38:41.681788+00:00"
}