chore(plans): flow debugger script entry — task ledger complete + gate evidence (rig H/H2/I, Playwright 4/4, browser)

Claude-Session: https://claude.ai/code/session_01NcMG6xXdsJbmD2wYAgkK29
This commit is contained in:
Joseph Doherty
2026-09-08 01:47:49 -04:00
parent 7792b76b12
commit 999882f6c1
2 changed files with 110 additions and 14 deletions
@@ -1204,3 +1204,15 @@ git commit -am "docs: flow debugger script entry — component specs, CLAUDE.md,
6. `dotnet test tests/ZB.MOM.WW.ScadaBridge.CentralUI.PlaywrightTests --filter "FullyQualifiedName~FlowDebuggerTests"` → all pass.
7. Browser (Claude in Chrome): open `http://localhost:9000/deployment/flow-debugger`, pick Site script → site-a → DelmiaSim01 → `OutboundDemo`, confirm the parameter form / no-params note, Run, graph completes; then pick a ValueChange script on the same instance (if seeded) and confirm the value field names its attribute.
8. Record outcomes in the plan ledger; hand back to the user for merge/push (finishing-a-development-branch).
---
## Gate evidence (2026-09-08, branch head `7792b76b` + text fixes)
- **Build:** `dotnet build ZB.MOM.WW.ScadaBridge.slnx` — 0 warnings, 0 errors.
- **Full test run** (`dotnet test` on the slnx, 30 projects): all pass except the 11 known role-negative Playwright tests on the login-disabled rig, the 2 new script-entry Playwright tests (run against the pre-rebuild image; pass after the rebuild, below), and `SiteAlarmAggregatorActorTests.Stream_GivenUp_After_MaxRetries_Reopens_On_Reconcile_Tick`, which passes in isolation (30/30) and is untouched by this branch (load-induced flake).
- **Targeted suites after the last fixes:** ManagementService.Tests 631/631 (FlowDebugRunnerTests 34), CentralUI.Tests 1280/1280 (FlowDebuggerPageTests 24, FlowDebugServiceTests 31), CLI.Tests 465/465, Commons.Tests (ScriptTriggerAttributeTests 15, FlowGraphBuilderTests 24).
- **Reviews:** per-task spec + code reviews per classification; a whole-branch review (opus) found I1 (transport faults escaped without a root row), I2 (write-kind completion not script-specific) and I3 (circuit-lifetime script cache) — all fixed (`ca9be68d`, `7197c398`) and re-reviewed (approved; two Minor test gaps left: `MaxWaitSeconds` clamp and the unresolved-option Ask fallback are untested).
- **Rig:** `bash docker/deploy.sh` rebuilt all 8 nodes; `FLOW_ONLY=1 DELMIA_API_KEY=… bash docker/verify-delmia-notifier.sh` → H YES (live 11 / replay 17), **H2 YES** (`run-script` on `DelmiaSim01`/`OutboundDemo`: kinds RouteCall,ApiCall,CachedSubmit,DbWriteCached,CachedResolve,NotifySend,ScriptRun), I YES.
- **Playwright** `FlowDebuggerTests` on the rebuilt rig: 4/4 (incl. `ScriptEntry_LiveRunOfACallScript_InBrowser_Completes`, `ScriptEntry_WriteKindScript_ShowsTheValueFieldForTheTriggerAttribute`).
- **Browser (Claude in Chrome, `localhost:9000`):** Site script → Test Plant A → DelmiaSim01 → picker lists `DelmiaReceiverSimulator (ValueChange: DelmiaReceiver.RecipeDownloadFlag)`, `OutboundDemo (Call)`, `ProcessRecipeDownload (Call)`; `ProcessRecipeDownload` renders the five-field `ParameterValueForm`; `OutboundDemo` shows *This script takes no parameters* and a Live run completed in 21 ms, 5 steps, 1 boundary, all External nodes Ok; `DelmiaReceiverSimulator` shows *New value for DelmiaReceiver.RecipeDownloadFlag* with Run disabled until a value is typed.
@@ -1,19 +1,103 @@
{
"planPath": "docs/plans/2026-09-08-flow-debugger-script-entry.md",
"tasks": [
{"id": 1, "subject": "Task 1: ScriptTriggerAttribute helper (Commons)", "status": "pending"},
{"id": 2, "subject": "Task 2: FlowDebugRunScriptCommand record", "status": "pending"},
{"id": 3, "subject": "Task 3: Extract WriteAndPollAsync from RunValueChangeAsync", "status": "pending"},
{"id": 4, "subject": "Task 4: FlowDebugRunner.RunScriptAsync", "status": "pending", "blockedBy": [1, 2, 3]},
{"id": 5, "subject": "Task 5: ManagementActor dispatch, role matrix, long-running registration", "status": "pending", "blockedBy": [4]},
{"id": 6, "subject": "Task 6: FlowGraphBuilder RouteCall-root pin", "status": "pending"},
{"id": 7, "subject": "Task 7: ParameterValueForm.ValidChanged", "status": "pending"},
{"id": 8, "subject": "Task 8: IFlowDebugService / FlowDebugService script entry", "status": "pending", "blockedBy": [1, 2]},
{"id": 9, "subject": "Task 9: Flow Debugger page script picker + inputs card", "status": "pending", "blockedBy": [7, 8]},
{"id": 10, "subject": "Task 10: CLI flow-debug run-script", "status": "pending", "blockedBy": [2]},
{"id": 11, "subject": "Task 11: Playwright script run + verify script leg", "status": "pending", "blockedBy": [9, 10]},
{"id": 12, "subject": "Task 12: Documentation", "status": "pending", "blockedBy": [5, 8, 10]},
{"id": 13, "subject": "Task 13: Gate — build, full tests, rig, browser", "status": "pending", "blockedBy": [11, 12]}
{
"id": 1,
"subject": "Task 1: ScriptTriggerAttribute helper (Commons)",
"status": "completed"
},
{
"id": 2,
"subject": "Task 2: FlowDebugRunScriptCommand record",
"status": "completed"
},
{
"id": 3,
"subject": "Task 3: Extract WriteAndPollAsync from RunValueChangeAsync",
"status": "completed"
},
{
"id": 4,
"subject": "Task 4: FlowDebugRunner.RunScriptAsync",
"status": "completed",
"blockedBy": [
1,
2,
3
]
},
{
"id": 5,
"subject": "Task 5: ManagementActor dispatch, role matrix, long-running registration",
"status": "completed",
"blockedBy": [
4
]
},
{
"id": 6,
"subject": "Task 6: FlowGraphBuilder RouteCall-root pin",
"status": "completed"
},
{
"id": 7,
"subject": "Task 7: ParameterValueForm.ValidChanged",
"status": "completed"
},
{
"id": 8,
"subject": "Task 8: IFlowDebugService / FlowDebugService script entry",
"status": "completed",
"blockedBy": [
1,
2
]
},
{
"id": 9,
"subject": "Task 9: Flow Debugger page script picker + inputs card",
"status": "completed",
"blockedBy": [
7,
8
]
},
{
"id": 10,
"subject": "Task 10: CLI flow-debug run-script",
"status": "completed",
"blockedBy": [
2
]
},
{
"id": 11,
"subject": "Task 11: Playwright script run + verify script leg",
"status": "completed",
"blockedBy": [
9,
10
]
},
{
"id": 12,
"subject": "Task 12: Documentation",
"status": "completed",
"blockedBy": [
5,
8,
10
]
},
{
"id": 13,
"subject": "Task 13: Gate \u2014 build, full tests, rig, browser",
"status": "completed",
"blockedBy": [
11,
12
]
}
],
"lastUpdated": "2026-09-08T00:00:00Z"
"lastUpdated": "2026-09-08T05:47:49Z"
}