2994 Commits

Author SHA1 Message Date
Joseph Doherty 0e6cef05e3 docs(scripts): design for #36 — reset-aware WriteBatchAndWaitAsync handshake
The MES/Delmia handshake fast-paths on the previous run's cached CompleteFlag
because the reset write has not echoed back before the wait registers. An
edge-triggered wait is rejected (a subscription can swallow the reset when the
device flips inside one sampling interval); the fix encodes the reset leg inside
a new WriteBatchAndWaitAsync overload that observes the reset echo before writing
the trigger and returns a phase-aware HandshakeResult.

Claude-Session: https://claude.ai/code/session_01XPsuy2ZZ5Gbyfpt8PrK5BV
2026-09-10 15:06:56 -04:00
Joseph Doherty b5eb08f1a9 fix(flow-debugger): method pane takes structured parameters via ParameterValueForm + raw-JSON escape hatch (#37)
The Run-inbound-API-method pane rendered one text box per top-level schema
field and coerced the text on the page; an array/object field went through
JsonNode.Parse and, on failure, was SENT AS A STRING, while an empty box was
silently dropped. A required array-of-object parameter (MesMoveOut WorkOrders)
could not be entered at all — QA runs reached the site with "WorkOrders":[].

- The method pane now renders the same shared ParameterValueForm the script
  pane uses (typed inputs, nested groups, add/remove list item editors,
  $ref:lib: resolution, inline validation), keyed on the method id so a change
  of method remounts it. The page keeps ONE value tree and BuildParameters()
  serializes it as-is; the flat _inputs / Coerce() / SetInput path is deleted.
- Form | Raw JSON toggle: raw mode is a Monaco json editor for the whole
  request body, given the method's root schema for completion, parsed and
  schema-validated (InboundApiSchema.Validate) on every edit with the error
  inline. Entering raw mode seeds the editor from the tree; leaving it
  re-mounts the form over the last valid tree.
- Run is disabled while the form or the raw document is invalid (a required
  field left empty disables Run before the first keystroke).
- localStorage per-method entry stores the value tree; on restore it is
  validated against the schema and dropped if invalid, which also retires the
  pre-#37 flat string-per-field entries.
- ParameterValueForm.ToJsonSchema / JsonElementToObject made internal static
  for page reuse.
- Tests: 7 new bUnit tests (WorkOrders array-of-object round-trip to the
  RunMethodAsync payload, required list-item gating, invalid raw JSON blocks
  Run + shows parse/schema/non-object errors, valid raw JSON sent verbatim and
  survives the switch back to the form, method switch resets, persisted tree
  restored, legacy flat entry dropped); existing method-pane tests moved to
  the form's #param-<field> ids and fill the required field before Run.
  Playwright smoke selector moved to #param-Text.
- Docs: design doc, Component-CentralUI.md entry-points bullet, CLAUDE.md.

CentralUI.Tests 1425/1425 green; Playwright project builds.

Claude-Session: https://claude.ai/code/session_01XPsuy2ZZ5Gbyfpt8PrK5BV
2026-09-10 14:54:21 -04:00
Joseph Doherty 3b1211d79f docs(flow-debugger): design for #37 — method pane structured parameters
Claude-Session: https://claude.ai/code/session_01XPsuy2ZZ5Gbyfpt8PrK5BV
2026-09-10 14:49:12 -04:00
Joseph Doherty 17864d1ae4 docs(deploy): records for 2b9a7c3c on DEV vd03 and the QA pair vq03/vq04
Both driven from the Mac over the winrm CLI (WinRM 5985 + SMB 445, no helper
on the boxes). Migration 53->55; the first Central boot encrypts
DataConnections.PrimaryConfiguration (dp:protocol:v1:), so rollback is the
COPY_ONLY DB restore, not a binary swap. QA: all four nodes stopped together,
one shared-DB migration, 2 min 35 s window, preflight against a restored clone.

Claude-Session: https://claude.ai/code/session_01RgthVLVU5CJ8SUuEwruTkt
2026-09-10 12:25:53 -04:00
Joseph Doherty 2b9a7c3ca0 Synchronize CLI documentation with management command parity 2026-09-10 01:20:12 -04:00
Joseph Doherty 0cc9db9e94 Record completed CLI parity verification and deployment 2026-09-10 00:54:52 -04:00
Joseph Doherty 2750bd2809 Complete management API and CLI command parity 2026-09-10 00:51:45 -04:00
Joseph Doherty 477e2abe97 Document management API and CLI parity gaps 2026-09-10 00:31:23 -04:00
Joseph Doherty 9ee402bbcd Resolve all 46 low-severity architecture review findings 2026-09-09 22:56:36 -04:00
Joseph Doherty fef3e7675f Merge codex/resolve-high-review-findings: 2026-09-09 arch-review remediation — all 13 High + 33 Medium findings
High slice 146a1323 (DCL subscription lifecycle + handle release + no write replay, source-scoped
OPC UA alarm snapshots, gRPC 32 MiB limits + audit byte budget, PSK identity bound to payload
ownership, no blind Unavailable replay, script-pool ConfigureAwait, audited-connection
transaction escape, trust deny-list, UI mutations through typed commands, idle-session
handling, circuit grant revalidation) and Medium slice 9a87d7a3 (see its message).

Verified before merge: dotnet build 0 errors; dotnet test (Playwright excluded) 9 397 passed,
0 failed, 0 skipped across 29 assemblies. Migration
20260909203046_EnforceGlobalInstanceNamesAndProtectProtocolConfiguration is a coordinated
central-pair upgrade (protocol config encrypted at rest; old binaries cannot read protected rows);
already applied on the local docker rig. 46 Low findings remain open.
2026-09-09 22:10:05 -04:00
Joseph Doherty 9a87d7a328 Resolve all 33 medium-severity architecture review findings
Second slice of the 2026-09-09 whole-system review remediation
(docs/plans/2026-09-09-arch-review.md §10), on top of the High slice 146a1323.

Runtime/devices: SR-2 alarm on-trigger integration scope; SR-3 correlated NativeAlarmActor
subscribe retry; SR-4 immutable audited DB target; SR-5 ordered InstanceActor stop/flush;
SR-12 rehydration fence; SR-13 S&F gate recheck per delivery; DC-4 no OPC UA security
downgrade; DC-5 alarm snapshot for every new subscriber; ORCH-1 sync-dispose joins the pump.

Management/UI: MG-2 site scope on audit tree + Flow Debugger Replay; MG-3 stale-probe memo
removed; MG-4 server-owned bulk-deploy deadline; UI-5 sandbox runs in a killable child
process (new CentralUI.SandboxWorker project); UI-14 bounded sandbox output/IPC.

Edge/audit: EI-1 relay audit ownership; EI-2 SkipBodyCapture suppresses error text; EI-3/EI-11
error-field redaction + caps; EI-4 single relay deadline, pre-execution-only retry; EI-5
authenticated relay provenance; EI-10 body cap before audit read.

Persistence/contracts: DL-1 global Instance.UniqueName unique index + conflict translation;
DL-2 DataConnection protocol config encrypted at rest (migration
20260909203046_EnforceGlobalInstanceNamesAndProtectProtocolConfiguration — coordinated
central upgrade, old binaries cannot read protected rows); DL-3 bounded Replay paging;
DL-6 cross-site Overwrite of a deployed instance rejected; XC-4 proto descriptor contract test.

Config/hygiene: XC-1 central listener isolation by local port; XC-2/XC-3 inert SMTP + cron
keys removed from rig settings; CM-2 env2 bootstrap guard enabled; DC-6 deploy site exit code;
DC-7 notifier retries only explicit standby rejection; XC-5 ClusterClient purged from docs.

Gates recorded in the report: build 0/0, 9 397 passed / 0 failed, rig redeployed on all
eight nodes with the migration applied. 46 Low findings remain open.
2026-09-09 22:05:30 -04:00
Joseph Doherty 146a13238f Resolve all high-severity architecture review findings 2026-09-09 16:13:58 -04:00
Joseph Doherty 8bfe65512e docs: update architecture review with independent findings and verification 2026-09-09 15:06:28 -04:00
Joseph Doherty c078bc8fd4 docs: whole-system architectural/code review 2026-09-09 (83 findings, 8 High; 9-WP remediation program)
Eight parallel area reviewers + orchestrator verification at main @ d8229916.
All 12 CLAUDE.md design commitments hold. Highs: DC-1 no unsubscribe ever sent,
DC-2 redundant Mx handle release freezes live tag, DC-3 device writes stashed
across reconnect, SR-1 sync Attributes[] blocks script pool, CM-1 no gRPC
message-size limit, MG-1 trust deny-list gap (CompilerServices/Loader), UI-1 UI
config edits bypass IAuditService, UI-2 session ping defeats idle timeout.
Suite: build 0/0, 9231 passed / 1 failed (ORCH-1 OperationTrackingStore
sync-dispose race). No code changed by this review.
2026-09-09 14:44:26 -04:00
Joseph Doherty d822991659 Merge feat/flow-debugger-step-logs: Flow Debugger v1.4 — Log global on all script surfaces, ScriptLog rows folded onto steps, exception detail on failed nodes 2026-09-09 13:37:29 -04:00
Joseph Doherty d9e22ae6fc Merge wt/step-logs-final: final-review remediation (I1/I2/M1-M8) 2026-09-09 13:31:32 -04:00
Joseph Doherty 97f01ae98e fix(flow-debugger): final-review remediation — 2000-row trace pull, shared ExceptionHeader parser, surrogate-safe clip, wording, alarm source, register renumber (I1/I2/M1-M8) 2026-09-09 13:30:48 -04:00
Joseph Doherty 0bacc3630e chore(plans): flow-debugger step logs — all 15 tasks complete, gate evidence 2026-09-09 13:03:37 -04:00
Joseph Doherty bc586b6249 Merge wt/step-logs-t15: Task 15 specs, register, FlowLogDemo seed + step J 2026-09-09 13:02:55 -04:00
Joseph Doherty 97f5f012a4 rig(flow-debugger): step J evidence
FLOW_ONLY note now names step J. Live gate on the docker rig (8 nodes rebuilt
from this branch via docker/deploy.sh, FlowLogDemo seeded by
docker/seed-flow-log-demo.sh — idempotent, add then update proven):

  J   step logs live+replay -> YES
      live:   YES root=5793ddc2-5273-4e62-86c2-ccfc8de0e080 logs=3 levels=debug,info,warn scriptRun=Failed error=CALL_FAILED
      replay: YES root=5793ddc2-5273-4e62-86c2-ccfc8de0e080 logs=3 levels=debug,info,warn scriptRun=Failed

H, H2 and I stayed YES in the same run.

Browser check (Playwright, /deployment/flow-debugger?executionId=<J root>,
screenshot /tmp/flow-log-demo.png): the SCRIPT RUN node is red with subtitle
"InvalidOperationException: demo failure" and badge "! 1 ≡ 2"; the WRITE node
carries no badge; the strip reads "LOG 0 errors · 1 warnings · 2 info"; the
detail panel opens on "Log (3)" with the full System.InvalidOperationException
block and the three info/debug/warn script lines.
2026-09-09 13:01:28 -04:00
Joseph Doherty 82739ec912 docs+rig(flow-debugger): step logs v1.4 specs, register rows, FlowLogDemo seed + verification step J 2026-09-09 12:56:39 -04:00
Joseph Doherty f174725557 Merge wt/step-logs-t13: Task 13 page strip counts, truncation notes, selection hookup 2026-09-09 12:48:26 -04:00
Joseph Doherty 25c6e9ca8a fix(central-ui): LogsTruncated clears once a refresh merges in more log rows; badge reworded (Task 13 review) 2026-09-09 12:48:00 -04:00
Joseph Doherty 032598607e feat(central-ui): Flow Debugger status strip log counts + inline-truncation notes; detail cross-step selection 2026-09-09 12:38:35 -04:00
Joseph Doherty 53c1280e36 Merge wt/step-logs-t7: Task 7 Log on compile surface, sandboxes, editor hosts 2026-09-09 12:34:29 -04:00
Joseph Doherty 0a78d0e3b8 fix(central-ui): Log on the inbound editor diagnostics host; sandbox Log delegates to Instance (Task 7 review) 2026-09-09 12:34:03 -04:00
Joseph Doherty 7d76bf96d5 Merge wt/step-logs-t10: Task 10 2026-09-09 12:32:35 -04:00
Joseph Doherty 21b691e45a Merge wt/step-logs-t6: Task 6 2026-09-09 12:32:34 -04:00
Joseph Doherty ba7f8ee7a9 feat(management): Flow Debugger inbound row carries exception detail; LogsTruncated on the run result
FlowDebugRunner.RunMethodAsync now passes InboundScriptResult.ErrorDetail through to the
synthesized inbound audit row's errorDetail, so a SCRIPT_ERROR run's exception ToString() lands
on AuditDetails.ErrorDetail for the Flow Debugger's inbound node to read (never surfaced to the
HTTP caller). FlowDebugRunResult grows an additive LogsTruncated (default false, last positional
member) reporting the inline FlowTraceCollector's low-priority (ScriptLog) truncation separately
from Truncated (step-row fidelity); RunMethodAsync/RunScriptAsync thread collector.LogsTruncated
through on their two collector-backed results.
2026-09-09 12:23:38 -04:00
Joseph Doherty 750c542c2f feat(site-runtime): ScriptRun rows carry exception detail; per-run log line cap + closing row (D3/D7) 2026-09-09 12:23:01 -04:00
Joseph Doherty b2418b41e1 feat(scripts): Log global on the compile surface and both Test Run sandboxes; trust-gate pin (D4) 2026-09-09 12:21:23 -04:00
Joseph Doherty 8ba1a0e2f8 Merge wt/step-logs-t14: Task 14 2026-09-09 12:19:36 -04:00
Joseph Doherty 20e9c14eec Merge wt/step-logs-t9: Task 9 2026-09-09 12:19:36 -04:00
Joseph Doherty 964bb9b2d7 Merge wt/step-logs-t5: Task 5 Log global wired into ScriptRuntimeContext 2026-09-09 12:15:29 -04:00
Joseph Doherty c1b1702397 fix(cli): single-key note rows render as raw indented lines under their step (Task 14 review) 2026-09-09 12:15:05 -04:00
Joseph Doherty 98c6809a66 feat(inbound-api): method-script exception detail on the inbound audit row, never on the HTTP body (D3) 2026-09-09 12:15:00 -04:00
Joseph Doherty ee8a8e9d3d fix(site-runtime): step-log review — trace-flag-gated ES step scope, shared-script Log, formatter guard
Task 5 code-review follow-ups:
- I1: ExternalSystemHelper gates its TraceStepScope on a new isTraced ctor arg
  (default false for direct construction), not on `_traceSink is not null` — a
  traced run without an inline collector still writes durable ScriptLog rows
  that must name their step.
- I2 (design §5): an inline shared script now SHARES its caller's ScriptLogger
  via the new `sharedLog` ctor param — one line cap, one anchor, one closing
  row. Consequence documented on the Log property: a shared script's lines
  carry the PARENT run's ExecutionId and land on the parent's ScriptRun node.
- M3: TraceCapturingLogger swallows a throwing formatter — most of what it
  captures is best-effort "audit write failed" warnings logged from inside a
  catch block, and a formatting exception must not escape that path.
- Tests: ApiCall step attribution, traced-without-collector, shared-script
  logger sharing, nested batch/wait scope attribution + unwind, throwing
  formatter; test (c) now also pins the anti-recursion property (EmitLog must
  log through the undecorated logger).

CompileSurfaceParityTests stays red until Task 7 mirrors Log on ScriptCompileSurface.
2026-09-09 12:10:17 -04:00
Joseph Doherty c6529fa996 feat(cli): flow-debug logs column and --show-logs 2026-09-09 12:03:42 -04:00
Joseph Doherty a45857ddd6 fix(management): FlowDebugRunner trace sinks use the collector's low-priority lane for ScriptLog rows (build fix after Task 2's Add(lowPriority:)) 2026-09-09 11:54:08 -04:00
Joseph Doherty 9b2dd6ec40 Merge wt/step-logs-t12: Task 12 2026-09-09 11:53:48 -04:00
Joseph Doherty db0fed495d Merge wt/step-logs-t11: Task 11 2026-09-09 11:53:47 -04:00
Joseph Doherty e149d96b9d Merge wt/step-logs-t8: Task 8 2026-09-09 11:53:47 -04:00
Joseph Doherty 488d955ba2 feat(site-runtime): Log global on ScriptRuntimeContext/ScriptGlobals; runtime lines attributed by TraceStepScope (D4-D6) 2026-09-09 11:53:06 -04:00
Joseph Doherty 7b3eaea891 fix(central-ui): FlowStepDetail keeps a still-valid tab across steps; refresh-persistence tests (Task 12 review) 2026-09-09 11:50:28 -04:00
Joseph Doherty 547aaefb02 fix(central-ui): exception subtitle parses inner/generic exception names; pill+badge test (Task 11 review) 2026-09-09 11:47:58 -04:00
Joseph Doherty 7245c63c62 fix(inbound-api): ScriptLog durable write before the Live sink; prove the central write (Task 8 review) 2026-09-09 11:47:23 -04:00
Joseph Doherty 9d9bb70a15 Merge wt/step-logs-t4: Task 4 ScriptLogger, TraceStepScope, TraceCapturingLogger 2026-09-09 11:42:59 -04:00
Joseph Doherty aaec993b84 fix(site-runtime): TraceCapturingLogger rejects double-wrapping; ScriptLogger clip keeps surrogate pairs (Task 4 review) 2026-09-09 11:42:40 -04:00
Joseph Doherty 16cdf0adf1 Merge wt/step-logs-t3: Task 3 FlowGraphBuilder log-line attachment 2026-09-09 11:40:05 -04:00
Joseph Doherty 2eaaed559f feat(inbound-api): Log global for method scripts, central ScriptLog rows when traced (D4/D5) 2026-09-09 11:39:25 -04:00