feat: store raw processor tree JSON and add error categorization fields
All checks were successful
CI / cleanup-branch (push) Has been skipped
CI / build (push) Successful in 1m0s
CI / docker (push) Successful in 53s
CI / deploy-feature (push) Has been skipped
CI / deploy (push) Successful in 37s

Fixes iteration overlay corruption caused by flat storage collapsing
duplicate processorIds across loop iterations.

Server:
- Store raw processor tree as processors_json JSONB on executions table
- Detail endpoint serves from processors_json (faithful tree), falls back
  to flat record reconstruction for older executions
- V10 migration: processors_json, error categorization (errorType,
  errorCategory, rootCauseType, rootCauseMessage), OTel (traceId, spanId),
  circuit breaker (circuitBreakerState, fallbackTriggered), drops
  erroneous splitDepth/loopDepth columns
- Add all new fields through full ingestion/storage/API chain

UI:
- Fix overlay wrapper filtering: check wrapper type before status filter
- Add new fields to schema.d.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-03-28 21:44:54 +01:00
parent f12f5f3c8d
commit 30344d29b1
12 changed files with 226 additions and 48 deletions

View File

@@ -29,10 +29,10 @@ function buildOverlay(
parentId?: string,
): void {
for (const proc of processors) {
if (!proc.processorId || !proc.status) continue;
if (proc.status !== 'COMPLETED' && proc.status !== 'FAILED') continue;
if (!proc.processorId) continue;
// Iteration wrapper: filter by selected iteration, skip the wrapper itself
// Iteration wrapper: filter by selected iteration, skip the wrapper itself.
// Must be checked before the status filter — wrappers may not have a status.
if (ITERATION_WRAPPER_TYPES.has(proc.processorType)) {
if (parentId && iterationState.has(parentId)) {
const info = iterationState.get(parentId)!;
@@ -48,7 +48,9 @@ function buildOverlay(
continue;
}
// Regular processor: add to overlay
// Regular processor: only include completed/failed nodes
if (!proc.status || (proc.status !== 'COMPLETED' && proc.status !== 'FAILED')) continue;
const subRouteFailed =
proc.status === 'FAILED' &&
(proc.processorType?.includes('DIRECT') || proc.processorType?.includes('SEDA'));