From 43e187a0235d8ae71cc4ceb45593afb23f390b8a Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Wed, 1 Apr 2026 10:45:12 +0200 Subject: [PATCH] fix: ChunkIngestionController ObjectMapper missing FAIL_ON_UNKNOWN_PROPERTIES Adds DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES=false (required by PROTOCOL.md) and explicit TypeReference> for array parsing. Without this, batched chunks from ChunkedExporter (2+ chunks in a JSON array) were silently rejected, causing final:true chunks to be lost and all exchanges to go stale. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../server/app/controller/ChunkIngestionController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/ChunkIngestionController.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/ChunkIngestionController.java index bf3085ec..a0164b0d 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/ChunkIngestionController.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/ChunkIngestionController.java @@ -3,6 +3,7 @@ package com.cameleer3.server.app.controller; import com.cameleer3.server.core.ingestion.ChunkAccumulator; import com.cameleer3.common.model.ExecutionChunk; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import io.swagger.v3.oas.annotations.Operation; @@ -40,6 +41,7 @@ public class ChunkIngestionController { this.accumulator = accumulator; this.objectMapper = new ObjectMapper(); this.objectMapper.registerModule(new JavaTimeModule()); + this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } @PostMapping("/executions") @@ -49,7 +51,7 @@ public class ChunkIngestionController { String trimmed = body.strip(); List chunks; if (trimmed.startsWith("[")) { - chunks = objectMapper.readValue(trimmed, new TypeReference<>() {}); + chunks = objectMapper.readValue(trimmed, new TypeReference>() {}); } else { ExecutionChunk single = objectMapper.readValue(trimmed, ExecutionChunk.class); chunks = List.of(single);