feat: amber container for filter/idempotent gate state + red pulse on failed badge
Some checks failed
CI / cleanup-branch (push) Has been skipped
CI / build (push) Failing after 29s
CI / docker (push) Has been skipped
CI / deploy (push) Has been skipped
CI / deploy-feature (push) Has been skipped

When a filter processor rejects a message (filterMatched=false) or an
idempotent consumer detects a duplicate (duplicateMessage=true), the
compound container turns amber (header, border, body tint).

Also adds red pulsing rings on the failed processor badge (same SMIL
pattern as the teal hasTraceData pulse).

Backend: ProcessorNode gains filterMatched/duplicateMessage fields,
threaded from ProcessorExecution JSON path.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-03-30 10:53:57 +02:00
parent a383b9bcf4
commit e2c0f203f9
5 changed files with 28 additions and 6 deletions

View File

@@ -97,6 +97,7 @@ public class DetailService {
p.getRootCauseType(), p.getRootCauseMessage(),
p.getErrorHandlerType(), p.getCircuitBreakerState(),
p.getFallbackTriggered(),
p.getFilterMatched(), p.getDuplicateMessage(),
hasTrace
);
for (ProcessorNode child : convertProcessors(p.getChildren())) {
@@ -132,6 +133,7 @@ public class DetailService {
p.rootCauseType(), p.rootCauseMessage(),
p.errorHandlerType(), p.circuitBreakerState(),
p.fallbackTriggered(),
null, null, // filterMatched, duplicateMessage (not in flat DB records)
hasTrace
));
}

View File

@@ -35,6 +35,8 @@ public final class ProcessorNode {
private final String errorHandlerType;
private final String circuitBreakerState;
private final Boolean fallbackTriggered;
private final Boolean filterMatched;
private final Boolean duplicateMessage;
private final boolean hasTraceData;
private final List<ProcessorNode> children;
@@ -50,6 +52,7 @@ public final class ProcessorNode {
String rootCauseType, String rootCauseMessage,
String errorHandlerType, String circuitBreakerState,
Boolean fallbackTriggered,
Boolean filterMatched, Boolean duplicateMessage,
boolean hasTraceData) {
this.processorId = processorId;
this.processorType = processorType;
@@ -73,6 +76,8 @@ public final class ProcessorNode {
this.errorHandlerType = errorHandlerType;
this.circuitBreakerState = circuitBreakerState;
this.fallbackTriggered = fallbackTriggered;
this.filterMatched = filterMatched;
this.duplicateMessage = duplicateMessage;
this.hasTraceData = hasTraceData;
this.children = new ArrayList<>();
}
@@ -103,6 +108,8 @@ public final class ProcessorNode {
public String getErrorHandlerType() { return errorHandlerType; }
public String getCircuitBreakerState() { return circuitBreakerState; }
public Boolean getFallbackTriggered() { return fallbackTriggered; }
public Boolean getFilterMatched() { return filterMatched; }
public Boolean getDuplicateMessage() { return duplicateMessage; }
public boolean isHasTraceData() { return hasTraceData; }
public List<ProcessorNode> getChildren() { return List.copyOf(children); }
}