)]}'
{
  "commit": "8a3053706823b03d76b0917e536c232793d277b5",
  "tree": "7ce60b4cc98814860c6d0d5f097011317502c9c2",
  "parents": [
    "f2839049ca3873cde0b0c8fe6ff519c040dc905a"
  ],
  "author": {
    "name": "Luke Haochao Zhuang",
    "email": "LukeHaochao.Zhuang@starbucks.cn",
    "time": "Fri Oct 23 12:13:21 2026 +0800"
  },
  "committer": {
    "name": "Luke Haochao Zhuang",
    "email": "LukeHaochao.Zhuang@starbucks.cn",
    "time": "Fri Oct 23 12:13:21 2026 +0800"
  },
  "message": "feat: add plugin graph validation and compilation\n\nImplement the graph DTO model and the validation/compilation core for the\noptional DAG plugin orchestration defined by the contract in #7994.\n\nNew DTOs (shenyu-common):\n- GraphData / GraphNodeData / GraphBranchData\n- GraphNodeTypeEnum (PLUGIN / CHOICE / END)\n\nNew graph package (org.apache.shenyu.common.graph):\n- GraphLimits: structural limits (nodes, out-degree, conditions, path length)\n- GraphValidationException: fail-closed, carries the violation list\n- GraphPlan: immutable compilation artifact (nodesById + successors)\n- GraphTopology: shared successor/type helpers\n- GraphValidator: cycle / reachability / reference / CHOICE determinism /\n  limits / missing-plugin (fail closed) / duplicate-path checks\n- GraphCompiler: validateOrThrow then build the immutable GraphPlan\n- LegacyChainImporter: import a linear plugin chain into an equivalent graph\n\n56 unit tests (JUnit5 + Hamcrest) cover all of the above; checkstyle clean\n(including test sources) and Apache RAT passes.\n\nThis branch is stacked on the #7994 contract branch; the compiler matches\nthat contract exactly.\n\nFixes #7995\nRefs #7993\n",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f11488ef1e3ca761c8b609d81c1f3b1dd6db5c9a",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/dto/GraphBranchData.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "624509ff2d68e8c81ea18581b75c9ed18166d087",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/dto/GraphData.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "935b701cc623780c1674a857b804f1cd85133da2",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/dto/GraphNodeData.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "5be41f848a26a97c413770b1d2a726784cf2321a",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/enums/GraphNodeTypeEnum.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1207263a940a4836c973de5714b53aace83bda25",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/graph/GraphCompiler.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1a488ce53edd7e7631c29d25d8bb2613a79e1922",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/graph/GraphLimits.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2c829b741daec649c6e389e41d28b48ff425c401",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/graph/GraphPlan.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "54b58a61557aa40e960d80a1d65f997a0a734d98",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/graph/GraphTopology.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "94f8d56fd0132816797dd91b9e7a66873e1f3a90",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/graph/GraphValidationException.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b7f5230289d283f5be568695543cc54bc3b77888",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/graph/GraphValidator.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d8c14c3e860be993115cd98e1aa01ee772085063",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/main/java/org/apache/shenyu/common/graph/LegacyChainImporter.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "06821d0893fd66c6cdb07ee3f53032e235ab07f0",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/test/java/org/apache/shenyu/common/dto/GraphBranchDataTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "b246022e87b3328bb1d67d853cd327f91453c9a3",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/test/java/org/apache/shenyu/common/dto/GraphDataTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "43435f9a199734f5f30810ffdac5ad89d644d459",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/test/java/org/apache/shenyu/common/dto/GraphNodeDataTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "488981e283553c32d5eea411264392fc2f5be541",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/test/java/org/apache/shenyu/common/enums/GraphNodeTypeEnumTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a59788ec6b82b84cfb105140af912338879ce72f",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/test/java/org/apache/shenyu/common/graph/GraphCompilerTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7a3564d200ac0a666f25c9ffd3f7f123e5ff2c2f",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/test/java/org/apache/shenyu/common/graph/GraphTopologyTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1728b39fa29ae2b5d8f846ff494376686a86e667",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/test/java/org/apache/shenyu/common/graph/GraphValidatorTest.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bdb79c8dd190b6d1dec1f00e7efaa68c0c5c1e00",
      "new_mode": 33188,
      "new_path": "shenyu-common/src/test/java/org/apache/shenyu/common/graph/LegacyChainImporterTest.java"
    }
  ]
}
