This is an automated email from the ASF dual-hosted git repository.

luigidemasi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-kit.git

commit f29378fbcf704ca02827876cb45f98297abded89
Author: Jinal Sarvaiya <[email protected]>
AuthorDate: Fri Nov 6 10:24:43 2026 +0000

    fix #100: parse inline backtick spans with Jackson to detect escaped 
envelope keys
---
 .../apache/camel/kit/ship/controller/ShipStageResult.java | 13 ++++++++++---
 .../camel/kit/ship/controller/ShipStageResultTest.java    | 15 +++++++++++++++
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git 
a/kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/controller/ShipStageResult.java
 
b/kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/controller/ShipStageResult.java
index 40110174..71628e01 100644
--- 
a/kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/controller/ShipStageResult.java
+++ 
b/kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/controller/ShipStageResult.java
@@ -380,8 +380,6 @@ record ShipStageResult(
         return result;
     }
 
-    private static final String ENVELOPE_MARKER = "\"materialAmbiguity\"";
-
     private static boolean hasBareJsonStart(String fragment) {
         int i = 0;
         int len = fragment.length();
@@ -394,7 +392,7 @@ record ShipStageResult(
                 }
                 if (j < len && fragment.charAt(j) == '`') {
                     String span = fragment.substring(i + 1, j);
-                    if (span.contains(ENVELOPE_MARKER)) {
+                    if (looksLikeEnvelope(span)) {
                         return true;
                     }
                     i = j + 1;
@@ -409,6 +407,15 @@ record ShipStageResult(
         return false;
     }
 
+    private static boolean looksLikeEnvelope(String span) {
+        try {
+            JsonNode node = JSON.readTree(span);
+            return node.isObject() && node.has("materialAmbiguity");
+        } catch (JsonProcessingException e) {
+            return false;
+        }
+    }
+
     static byte[] utf8(String value, int maximum, String label) throws 
IOException {
         if (value == null || value.length() > maximum) {
             throw new IOException("Pi " + label + " exceeds its size limit");
diff --git 
a/kit/camel-kit-core/src/test/java/org/apache/camel/kit/ship/controller/ShipStageResultTest.java
 
b/kit/camel-kit-core/src/test/java/org/apache/camel/kit/ship/controller/ShipStageResultTest.java
index a1b400cf..f7d27a63 100644
--- 
a/kit/camel-kit-core/src/test/java/org/apache/camel/kit/ship/controller/ShipStageResultTest.java
+++ 
b/kit/camel-kit-core/src/test/java/org/apache/camel/kit/ship/controller/ShipStageResultTest.java
@@ -521,6 +521,21 @@ class ShipStageResultTest {
                 "backtick-wrapped correction envelope");
     }
 
+    @Test
+    void rejectsInlineBacktickWrappedCorrectionWithEscapedKey() throws 
Exception {
+        ObjectNode fenced = result(null, null);
+        ObjectNode bare = result(null, null);
+        bare.put("materialAmbiguity", true);
+        bare.withArray("unansweredQuestions").addObject()
+                .put("question", "Which retry 
limit?").putNull("defaultApplied");
+        String bareJson = JSON.writeValueAsString(bare)
+                .replace("\"materialAmbiguity\"", 
"\"\\u006daterialAmbiguity\"");
+        String input = "```json\n" + JSON.writeValueAsString(fenced)
+                       + "\n```\nCorrection, use this instead: `" + bareJson + 
"`";
+        assertRejected(Stage.DESIGN, input,
+                "backtick-wrapped correction envelope with escaped key");
+    }
+
     @Test
     void acceptsHarmlessInlineJsonExample() throws Exception {
         ObjectNode valid = result("149-local-controller", null);

Reply via email to