feat(management): FlowDebug run-method / run-value-change / replay commands (Deployer, active-node gated, inline trace)

Flow Debugger (design 2026-09-05 §7.1): FlowDebugRunMethodCommand / FlowDebugRunValueChangeCommand /
FlowDebugReplayCommand on the per-node ManagementActor (Deployer role; the two run commands
are long-running), all delegating to FlowDebugRunner. RunMethod refuses on a standby with
STANDBY_NODE (ManagementCommandException now carries an optional Code that replaces
COMMAND_FAILED), validates parameters through the real ParameterValidator/SchemaRefResolver
(made public), synthesizes the inbound row (actor = operator, Extra.source = flow-debugger)
and runs the method through InboundScriptExecutor with a trace-sink RouteHelper so the reply
carries the RouteCall row + the site's inline events. RunValueChange does a traced routed
write via IInstanceRouter, then polls IPullTraceEventsClient (interface moved to Commons so
ManagementService can consume it) until a ScriptRun parented to the root settles, else
NO_TRIGGER_WITHIN_WINDOW. Replay reads IAuditLogRepository.GetTraceEventsAsync.

Claude-Session: https://claude.ai/code/session_01GSLkkHKz9JrAtmJjmQK3cP
This commit is contained in:
Joseph Doherty
2026-09-06 00:04:18 -04:00
parent 9300bc1a4f
commit d11dcb77c5
11 changed files with 675 additions and 33 deletions
@@ -4,12 +4,12 @@
{
"id": 0,
"subject": "Task 0: Amend the design doc with the four planning corrections",
"status": "pending"
"status": "completed"
},
{
"id": 1,
"subject": "Task 1: Audit enums \u2014 ScriptTrace channel and four kinds",
"status": "pending",
"subject": "Task 1: Audit enums — ScriptTrace channel and four kinds",
"status": "completed",
"blockedBy": [
0
]
@@ -17,15 +17,15 @@
{
"id": 2,
"subject": "Task 2: Additive Trace / trace-payload fields on the message records",
"status": "pending",
"status": "completed",
"blockedBy": [
0
]
},
{
"id": 3,
"subject": "Task 3: ApiMethod.TraceAllCalls \u2014 entity, EF migration, management command, CLI flag",
"status": "pending",
"subject": "Task 3: ApiMethod.TraceAllCalls — entity, EF migration, management command, CLI flag",
"status": "completed",
"blockedBy": [
0
]
@@ -33,7 +33,7 @@
{
"id": 4,
"subject": "Task 4: FlowStep projection + FlowGraph model + FlowGraphBuilder (pure)",
"status": "pending",
"status": "completed",
"blockedBy": [
1,
2
@@ -42,15 +42,15 @@
{
"id": 5,
"subject": "Task 5: FlowTraceCollector (site, per run)",
"status": "pending",
"status": "completed",
"blockedBy": [
0
]
},
{
"id": 6,
"subject": "Task 6: ScriptRuntimeContext \u2014 traced flag, trace emission for writes and waits, flag inheritance",
"status": "pending",
"subject": "Task 6: ScriptRuntimeContext — traced flag, trace emission for writes and waits, flag inheritance",
"status": "completed",
"blockedBy": [
4,
5
@@ -58,24 +58,24 @@
},
{
"id": 7,
"subject": "Task 7: ScriptRunLauncher + ScriptActor \u2014 ScriptRun rows, ExecutionId + events, value-change inheritance",
"status": "pending",
"subject": "Task 7: ScriptRunLauncher + ScriptActor — ScriptRun rows, ExecutionId + events, value-change inheritance",
"status": "completed",
"blockedBy": [
6
]
},
{
"id": 8,
"subject": "Task 8: InstanceActor \u2014 trace arm for data-sourced writes; Trace on published changes",
"status": "pending",
"subject": "Task 8: InstanceActor — trace arm for data-sourced writes; Trace on published changes",
"status": "completed",
"blockedBy": [
2
]
},
{
"id": 9,
"subject": "Task 9: DeploymentManagerActor routing \u2014 pass Trace, return child id + events",
"status": "pending",
"subject": "Task 9: DeploymentManagerActor routing — pass Trace, return child id + events",
"status": "completed",
"blockedBy": [
7,
8
@@ -83,8 +83,8 @@
},
{
"id": 10,
"subject": "Task 10: Wire \u2014 site_command.proto trace fields, mapper, golden samples",
"status": "pending",
"subject": "Task 10: Wire — site_command.proto trace fields, mapper, golden samples",
"status": "completed",
"blockedBy": [
2,
11
@@ -92,16 +92,16 @@
},
{
"id": 11,
"subject": "Task 11: Wire \u2014 sitestream.proto source_execution_id/trace + PullTraceEvents RPC; site SQLite read by execution ids",
"status": "pending",
"subject": "Task 11: Wire — sitestream.proto source_execution_id/trace + PullTraceEvents RPC; site SQLite read by execution ids",
"status": "completed",
"blockedBy": [
2
]
},
{
"id": 12,
"subject": "Task 12: RouteHelper \u2014 always-on RouteCall audit row, WithTrace, inline trace sink",
"status": "pending",
"subject": "Task 12: RouteHelper — always-on RouteCall audit row, WithTrace, inline trace sink",
"status": "completed",
"blockedBy": [
1,
2,
@@ -111,7 +111,7 @@
{
"id": 13,
"subject": "Task 13: InboundScriptExecutor.ExecuteAsync(trace) + endpoint honours TraceAllCalls",
"status": "pending",
"status": "completed",
"blockedBy": [
12
]
@@ -119,14 +119,14 @@
{
"id": 14,
"subject": "Task 14: IAuditLogRepository.GetTraceEventsAsync(rootExecutionId)",
"status": "pending",
"status": "completed",
"blockedBy": [
1
]
},
{
"id": 15,
"subject": "Task 15: Management commands \u2014 FlowDebugRunMethod / RunValueChange / Replay",
"subject": "Task 15: Management commands — FlowDebugRunMethod / RunValueChange / Replay",
"status": "pending",
"blockedBy": [
9,
@@ -155,7 +155,7 @@
},
{
"id": 18,
"subject": "Task 18: Central UI service \u2014 IFlowDebugService / FlowDebugService",
"subject": "Task 18: Central UI service — IFlowDebugService / FlowDebugService",
"status": "pending",
"blockedBy": [
15,
@@ -164,7 +164,7 @@
},
{
"id": 19,
"subject": "Task 19: FlowGraphView \u2014 custom SVG swimlane renderer",
"subject": "Task 19: FlowGraphView — custom SVG swimlane renderer",
"status": "pending",
"blockedBy": [
4
@@ -172,7 +172,7 @@
},
{
"id": 20,
"subject": "Task 20: Flow Debugger page \u2014 toolbar, inputs, predicted graph, run, detail panel",
"subject": "Task 20: Flow Debugger page — toolbar, inputs, predicted graph, run, detail panel",
"status": "pending",
"blockedBy": [
18,
@@ -190,7 +190,7 @@
},
{
"id": 22,
"subject": "Task 22: Rig \u2014 retention override, redeploy, verification step H",
"subject": "Task 22: Rig — retention override, redeploy, verification step H",
"status": "pending",
"blockedBy": [
16,
@@ -207,5 +207,5 @@
]
}
],
"lastUpdated": "2026-09-06T03:22:55.422160+00:00"
"lastUpdated": "2026-09-06T03:58:13.917546+00:00"
}