)]}'
{
  "commit": "c841e379da629ae6125ee6bfa0144269de1319ae",
  "tree": "de55a31276a1f96d48ae40c0c0d6c4331913da9d",
  "parents": [
    "b4c6cbfcc546d19fd19acda72c52a830941e2c6d"
  ],
  "author": {
    "name": "承潜",
    "email": "2972013548@qq.com",
    "time": "Sun Jul 26 11:17:00 2026 +0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sun Jul 26 11:17:00 2026 +0800"
  },
  "message": "feat: Support version history and rollback for traffic rules (#1477)\n\n* chore(store): add ListResources + align gorm/memory empty-index semantics\n\n* fix(discovery): nil-guard zk rule delete + emit registry context on events\n\n* feat(versioning): backend immutable release ledger for traffic rules\n\n* feat(versioning): UI history drawer, diff, and rollback for rule pages\n\n* test(versioning): end-to-end rollback drill\n\n* fix(versioning): close gaps surfaced by the smoke drill\n\nRunning the §9.4 smoke drill end-to-end uncovered three real defects\nthat the unit suite did not catch:\n\n- RuleVersionSubscriber recorded a duplicate UPSTREAM row whenever the\n  registry echoed back a no-op change identical to the latest ledger\n  row (typically right after BOOTSTRAP). Now dedupes upstream events\n  whose content hash already matches the current head, with an explicit\n  test in versioning_test.go.\n- writeVersioningResp mapped every bizerror to HTTP 200/UnknownError;\n  bizerror.InvalidArgument (eg. empty rollback reason) now returns\n  HTTP 400 with its original code so the frontend can act on it.\n  Covered by a new handler/rule_version_test.go.\n- The 409 VERSION_CONFLICT toast auto-dismissed after the default\n  duration; users could miss the Reload button entirely. Pinned with\n  duration: 0 so the notification stays until acknowledged.\n\n* fix(traffic): preserve priority/force/configVersion on rule edit forms\n\nThe §9.4 smoke drill expectation \"after rollback, the rule should look\nthe same on UI refresh\" exposed a pre-existing edit-form regression:\nrollback was correct at the ledger and ZK levels, but the edit form\nsilently dropped `priority`, `force`, and (for condition routes)\n`configVersion` because they were neither rendered in the GET response\nnor re-sent on save.\n\nThis is not caused by versioning, but a true round-trip is the first\nflow that forces every field through the loop. Adds the missing fields\nto ConditionRuleResp / TagRuleResp on the backend, and reads/writes\nthem in updateByFormView.vue on the frontend so a \"save → rollback →\nreload\" cycle is now lossless.\n\n* chore: ignore local planning artifacts\n\nAdd /task_plan.md /findings.md /progress.md to .gitignore so the\nplanning-with-files workflow does not leak per-developer working\nmemory into the repo.\n\n* fix(versioning): close owner review correctness gaps\n\n* refactor(versioning): drop unused helpers and aliases\n\n* fix(ui): plug rule diff editor leaks\n\n* Remove local working memory files from .gitignore\n\n* fix(versioning): add intent repair and abandon flows\n\n* Revert \"feat: support traffic rule version history and rollback\"\n\n* fix(lock): use acquisition-scoped leases\n\n* refactor(versioning): split resource store responsibilities\n\n* refactor(versioning): normalize events and reduce repair APIs\n\n* fix(lock): stop writes after lease loss\n\n* refactor(ui): remove unreachable state and simplify mocks\n\n* test(versioning): add multi-instance and lease failure coverage\n\n* docs(versioning): update default-enabled guarantees\n\n* fix: address rule versioning review blockers\n\n- require lease contexts for rule versioning mutations\n\n- propagate contexts through resource manager and governor writes\n\n- move repair/bootstrap reads inside rule locks\n\n- use ledger snapshots for current and deleted state\n\n- remove unused subscriber intent token path\n\n- simplify rollback commit handling and add UI coverage\n\n* fix: harden rule versioning correctness\n\n* fix: address rule versioning review issues\n\n* Fix rule version commit terminal semantics\n\n* fix(versioning): harden rule intent recovery\n\n* fix(versioning): close intent recovery race windows\n\n* Fix rule intent storage CAS and subscriber fallback\n\n* Fix rule version committing recovery ordering\n\n* Fix Go CI cache restore\n\n* Clean up PR-only test files\n\n* docs(versioning): clarify invariants and recovery comments\n\n* 20 maxVersion is suitable\n\n* chore: limit rule version retention to 20\n\n* refactor: simplify rule version history\n\n* refactor: restore core mutation and lock interfaces\n\n* refactor: enforce lightweight rule history semantics\n\n* refactor: clean rule history frontend semantics\n\n* docs: describe lightweight rule history config\n\n* test: add frontend npm test script\n\n* fix: address copilot review comments\n\n* fix: make rule versioning fail closed\n\n* refactor: collapse versioning store abstraction\n\n* refactor: reuse resource helpers in rule versioning\n\n- move resource key parsing next to BuildResourceKey\n- centralize live rule lookup in console version service\n- deduplicate RuleVersion resource conversion/sorting helpers\n- no behavior/API/storage semantic changes\n\n* fix: address traffic rule history review blockers\n\n* fix: clear traffic view type errors\n\n* fix: address remaining rule version review comments\n\n* fix: add license header to js-yaml declaration\n\n* style: refine version record tag and layout in traffic rule views",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "4065f4254878940a905bedf73c385ea08d27c4e5",
      "old_mode": 33188,
      "old_path": ".github/workflows/ci.yml",
      "new_id": "5aa4afc3c90190b0aad6f69ec9ca77d0e566c84d",
      "new_mode": 33188,
      "new_path": ".github/workflows/ci.yml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7030b9af7e33ff8817951d7cbaa1c1d2d339b424",
      "new_mode": 33188,
      "new_path": "api/mesh/v1alpha1/rule_version.pb.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ce446cd870cd7b4397827b84a0e115d04e893d56",
      "new_mode": 33188,
      "new_path": "api/mesh/v1alpha1/rule_version.proto"
    },
    {
      "type": "modify",
      "old_id": "1e74b47eabad424e0e4636c560633417ed3bcc5e",
      "old_mode": 33188,
      "old_path": "app/dubbo-admin/dubbo-admin.yaml",
      "new_id": "a9588337ed7dfe432d0189ecbd7290d6692508b3",
      "new_mode": 33188,
      "new_path": "app/dubbo-admin/dubbo-admin.yaml"
    },
    {
      "type": "modify",
      "old_id": "310905734f458abd35d781c89931abdd15041a5a",
      "old_mode": 33188,
      "old_path": "docs/server-develop.md",
      "new_id": "0c71ef67ddd6ad1c11adcc4395c0963efa2d54f5",
      "new_mode": 33188,
      "new_path": "docs/server-develop.md"
    },
    {
      "type": "modify",
      "old_id": "71cf3f95ff9633c513971f8e2a8b068f4d0007d3",
      "old_mode": 33188,
      "old_path": "pkg/config/app/admin.go",
      "new_id": "c2c05f295aa0196f2e23ce58d94215e9f06a9dd7",
      "new_mode": 33188,
      "new_path": "pkg/config/app/admin.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ceaf84d891cd308ef8c3d8d722382426de2c0486",
      "new_mode": 33188,
      "new_path": "pkg/config/app/admin_test.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0a112f5a8e8541b2f270eadbd826b18fd91b7bc1",
      "new_mode": 33188,
      "new_path": "pkg/config/versioning/config.go"
    },
    {
      "type": "modify",
      "old_id": "f4c64ce5bc3f4bfae95eb4e3777d858ab90df089",
      "old_mode": 33188,
      "old_path": "pkg/console/context/context.go",
      "new_id": "496011d265c9f26fc381c8ec50ff7a0e881ff7d9",
      "new_mode": 33188,
      "new_path": "pkg/console/context/context.go"
    },
    {
      "type": "modify",
      "old_id": "653c12e7168a279ed903e14a69c4b7cbdbd2b0d4",
      "old_mode": 33188,
      "old_path": "pkg/console/handler/condition_rule.go",
      "new_id": "38309a3e4755f4e2dd4d6f693d0fa28db6ea28fd",
      "new_mode": 33188,
      "new_path": "pkg/console/handler/condition_rule.go"
    },
    {
      "type": "modify",
      "old_id": "0b806715b02c3731eec04d165152a46127e60431",
      "old_mode": 33188,
      "old_path": "pkg/console/handler/configurator_rule.go",
      "new_id": "0323eaaf5dc6355d3aa0faf0e331e2dc40ffa1be",
      "new_mode": 33188,
      "new_path": "pkg/console/handler/configurator_rule.go"
    },
    {
      "type": "modify",
      "old_id": "1d9dc9715f377fd60eb3cd64423009622052d5f0",
      "old_mode": 33188,
      "old_path": "pkg/console/handler/overview.go",
      "new_id": "5f2e60f7c2f1a24d5d44511906ae75341fa0ad9a",
      "new_mode": 33188,
      "new_path": "pkg/console/handler/overview.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "711a5e267ef327f8bbf8a07848539ec3927f5730",
      "new_mode": 33188,
      "new_path": "pkg/console/handler/rule_version.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "648d7f236da1ce2dd23c04a32c8ec89e4a404d4f",
      "new_mode": 33188,
      "new_path": "pkg/console/handler/rule_version_test.go"
    },
    {
      "type": "modify",
      "old_id": "a6fe3637cd1e790429d30504314bf8bedf58df0c",
      "old_mode": 33188,
      "old_path": "pkg/console/handler/tag_rule.go",
      "new_id": "d07ad2c6b721ea842d4b6293212faaabeebefc61",
      "new_mode": 33188,
      "new_path": "pkg/console/handler/tag_rule.go"
    },
    {
      "type": "modify",
      "old_id": "11b92fe1168f900e6b45e6c57536b702ffa47903",
      "old_mode": 33188,
      "old_path": "pkg/console/model/condition_rule.go",
      "new_id": "a0e479d9059e4d37847893ec059ba6ba4b5bd4c2",
      "new_mode": 33188,
      "new_path": "pkg/console/model/condition_rule.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "00f631857ebce8b81c908bf359be3b3e71c356c5",
      "new_mode": 33188,
      "new_path": "pkg/console/model/rule_version.go"
    },
    {
      "type": "modify",
      "old_id": "9428771eafc3138d20fb9ef104362c1df821e615",
      "old_mode": 33188,
      "old_path": "pkg/console/model/tag_rule.go",
      "new_id": "b4d733f2eaf7150726bc64ea74bf857ab2cf88c1",
      "new_mode": 33188,
      "new_path": "pkg/console/model/tag_rule.go"
    },
    {
      "type": "modify",
      "old_id": "24cd7d44c865d643e26803d4fcee53317b567149",
      "old_mode": 33188,
      "old_path": "pkg/console/router/router.go",
      "new_id": "85704c476d76c094471225eb3e1bfac7c45e7094",
      "new_mode": 33188,
      "new_path": "pkg/console/router/router.go"
    },
    {
      "type": "modify",
      "old_id": "9fae159405a2197ca676d7386036aae16ab606c0",
      "old_mode": 33188,
      "old_path": "pkg/console/service/condition_rule.go",
      "new_id": "f69a63c8509eec5ccedaf825862485c6fe5805ce",
      "new_mode": 33188,
      "new_path": "pkg/console/service/condition_rule.go"
    },
    {
      "type": "modify",
      "old_id": "13dd2284deda716af453a91afe6fa51651e7e858",
      "old_mode": 33188,
      "old_path": "pkg/console/service/configurator_rule.go",
      "new_id": "e7929e818f5a45c167a9cbf6d0ff88cb82ed3e58",
      "new_mode": 33188,
      "new_path": "pkg/console/service/configurator_rule.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bbe5cf7b5328f46cae08369e5b0664b82a792cb3",
      "new_mode": 33188,
      "new_path": "pkg/console/service/rule_version.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c0e1f50bc641505280b0dd58c955b8b7b83b3ed4",
      "new_mode": 33188,
      "new_path": "pkg/console/service/rule_version_rollback_test.go"
    },
    {
      "type": "modify",
      "old_id": "a051117ca75fb565ec0ac373afd06d6c81600265",
      "old_mode": 33188,
      "old_path": "pkg/console/service/tag_rule.go",
      "new_id": "ce6d716cde2db1847a520b0e78fd8c6133d26501",
      "new_mode": 33188,
      "new_path": "pkg/console/service/tag_rule.go"
    },
    {
      "type": "modify",
      "old_id": "d1ee2c0dc14a83bb41f162b15ab2382d2785c7ce",
      "old_mode": 33188,
      "old_path": "pkg/core/bootstrap/bootstrap.go",
      "new_id": "a7b5439e17a3100997e9394bf8f5b54d3c2bf81c",
      "new_mode": 33188,
      "new_path": "pkg/core/bootstrap/bootstrap.go"
    },
    {
      "type": "modify",
      "old_id": "c590b84da50c4f2e826b168c17e5465774a93372",
      "old_mode": 33188,
      "old_path": "pkg/core/bootstrap/init.go",
      "new_id": "0fe16c190433cb5a7c3c4bf5cb7b08e591df2723",
      "new_mode": 33188,
      "new_path": "pkg/core/bootstrap/init.go"
    },
    {
      "type": "modify",
      "old_id": "07f9a2620bad4e39597c84e4cb096ac30564ec2b",
      "old_mode": 33188,
      "old_path": "pkg/core/discovery/subscriber/zk_config.go",
      "new_id": "f9e0eec11543a3183fe5acb3330a9f1d5dc06d90",
      "new_mode": 33188,
      "new_path": "pkg/core/discovery/subscriber/zk_config.go"
    },
    {
      "type": "modify",
      "old_id": "51393c4d292c638cb26f10d8b315cd98dffe7278",
      "old_mode": 33188,
      "old_path": "pkg/core/events/eventbus.go",
      "new_id": "42c06df00bec5c9630fcc6022397716c84342d8b",
      "new_mode": 33188,
      "new_path": "pkg/core/events/eventbus.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2fb5160897fc01987ff532501abe9d5e938cef98",
      "new_mode": 33188,
      "new_path": "pkg/core/resource/apis/mesh/v1alpha1/rule_version_types.go"
    },
    {
      "type": "modify",
      "old_id": "1ff3485b83d5d66ed319dd6dbc66a4d88a265842",
      "old_mode": 33188,
      "old_path": "pkg/core/resource/model/resource.go",
      "new_id": "d940ca268db6548d26bb5c7682fdc06a708304e8",
      "new_mode": 33188,
      "new_path": "pkg/core/resource/model/resource.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3353c8891bc1a9d51bc664577309660aa7474a12",
      "new_mode": 33188,
      "new_path": "pkg/core/resource/model/resource_test.go"
    },
    {
      "type": "modify",
      "old_id": "191470b00d421c998b56bc602308b54f3d6edcc2",
      "old_mode": 33188,
      "old_path": "pkg/core/runtime/builder.go",
      "new_id": "8a7933365e9568a0e3548c23ce9ad6e849536532",
      "new_mode": 33188,
      "new_path": "pkg/core/runtime/builder.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "696c80f8a496d104a3f2c9fb56f39f426bb953eb",
      "new_mode": 33188,
      "new_path": "pkg/core/store/index/rule_version.go"
    },
    {
      "type": "modify",
      "old_id": "8923f6577f1ec75d8a0d6c13f565f9fc53b78d3f",
      "old_mode": 33188,
      "old_path": "pkg/core/store/store.go",
      "new_id": "2df9fc8a8de9a91d3cbd2860074e6c8870d0236a",
      "new_mode": 33188,
      "new_path": "pkg/core/store/store.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "06c8dfdc4e5a5ae46074f4aa9f2679640d8643dc",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/bootstrap.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "fed475eee679e9a79f4e90514c7af49c28e92e67",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/component.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "34cfce72ba05ab0196e67149e5ddb6908eb087cc",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/normalize.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2d783f55f9e5bc68a3708a4db9809512d285c20e",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/resource_store_adapter.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ff412ba5bd5e0a8331e6286ca51d480dc87fc45a",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/resource_store_adapter_test.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "894b9c52fe97f5797138f50a133de2a4baad6853",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/resource_store_convert.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f686a2b1eb86d6cda7ab579f87cf308d4003b64f",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/resource_store_version.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "25147c31b9746b718cd9e26471be8e1ed10300ea",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/service.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2c175f900160871c3a075d0b9b07a0767cbc9d10",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/service_test.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "34ca33e47412520394d054c4e3ede542a714a3c6",
      "new_mode": 33188,
      "new_path": "pkg/core/versioning/types.go"
    },
    {
      "type": "modify",
      "old_id": "cedc201442631c56555522c8479f930c154dbaee",
      "old_mode": 33188,
      "old_path": "pkg/store/dbcommon/gorm_store.go",
      "new_id": "ccf54cf2c2b9469a77d5d68156ea9ebcd6b4a71e",
      "new_mode": 33188,
      "new_path": "pkg/store/dbcommon/gorm_store.go"
    },
    {
      "type": "modify",
      "old_id": "b1dd1b8c6f21d89c17b2c0abbe8d49081666c11e",
      "old_mode": 33188,
      "old_path": "pkg/store/dbcommon/gorm_store_test.go",
      "new_id": "238113c1113e1e8a2eb311347d449dc51b698480",
      "new_mode": 33188,
      "new_path": "pkg/store/dbcommon/gorm_store_test.go"
    },
    {
      "type": "modify",
      "old_id": "8ad401995113114aedbffdeb161418f4ee22e6da",
      "old_mode": 33188,
      "old_path": "pkg/store/memory/store_test.go",
      "new_id": "9bb51af666ed91b9690e2ce9b42e95571f2119b6",
      "new_mode": 33188,
      "new_path": "pkg/store/memory/store_test.go"
    },
    {
      "type": "modify",
      "old_id": "54216c4f282733c2a791ab7c6006bb7baae8822d",
      "old_mode": 33188,
      "old_path": "release/kubernetes/dubbo-system/dubbo-admin.yaml",
      "new_id": "517cdfeb4c16dee2b3594b16957594224b3d2c2f",
      "new_mode": 33188,
      "new_path": "release/kubernetes/dubbo-system/dubbo-admin.yaml"
    },
    {
      "type": "modify",
      "old_id": "70b06d7c17145ecb771f4edbc12c3cbf9e22d49c",
      "old_mode": 33188,
      "old_path": "ui-vue3/package.json",
      "new_id": "4eec7fee3701d95c3f81c31ff89b69cc3b04e570",
      "new_mode": 33188,
      "new_path": "ui-vue3/package.json"
    },
    {
      "type": "modify",
      "old_id": "9d4ff0a29817d3cf107e1593e9bd8b765486fce6",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/api/service/traffic.ts",
      "new_id": "06dd4166430472d0ec39a2d3d3037b1b52eb3b3b",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/api/service/traffic.ts"
    },
    {
      "type": "modify",
      "old_id": "094a76cdd577910c5b198d51634a3e8510656db4",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/base/http/request.ts",
      "new_id": "bc5956eca1b96d81bac8f39bf6974b578f10ea75",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/base/http/request.ts"
    },
    {
      "type": "modify",
      "old_id": "1ae6ec15acb5892ea5cff3b7f58acc4d381bfc22",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/base/i18n/en.ts",
      "new_id": "ebdf3443d5cea7c8bc8cd35ec0e1af5d069b49f7",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/base/i18n/en.ts"
    },
    {
      "type": "modify",
      "old_id": "c355a42c992f5f2a4fb8e3472ed0ab04fc9d3963",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/base/i18n/zh.ts",
      "new_id": "776cf5958399ad9f7f0bcb9b1dfc842d132499f2",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/base/i18n/zh.ts"
    },
    {
      "type": "modify",
      "old_id": "f46ff3bdaa077f023b2c4934dd1ee838905fd4f5",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/mocks/handlers.ts",
      "new_id": "8691eb4600de2864d3669dc7d289fea8d97154ab",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/mocks/handlers.ts"
    },
    {
      "type": "modify",
      "old_id": "3e5b355af5637c8ba075e4a57ffac42d4991150f",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/mocks/handlers/dynamicConfig.ts",
      "new_id": "83ed38a22fd7c3c1bb533231a2f3d1b741b35096",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/mocks/handlers/dynamicConfig.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0eddadcc9477698b6aab69604f45d5c9d86cf095",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/mocks/handlers/ruleVersion.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f7f0ee1c51b89cb6a1482a89d6870f2cf824e662",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/types/js-yaml.d.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e57b45050a9613a10ccb8747603b137bdd7bcea2",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/_shared/RuleDiffEditor.vue"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "60f54841449b0a2d377a31de07c36311c0db827a",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/_shared/RuleHistoryDrawer.vue"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "36e0b4c94a6178f3a6d5ebd81c3b400290c963c9",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/_shared/RuleHistoryPanel.spec.ts"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e3ddb335bd89794f3d4bb5ca0366a12238db9e3b",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/_shared/RuleHistoryPanel.vue"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "adb6999c0f4d91bb3a00f1c1851db492759e4b3b",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/_shared/ruleVersion.ts"
    },
    {
      "type": "modify",
      "old_id": "baad34d0290c194b6ee375f8d539b5ed9612e4c3",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/dynamicConfig/index.vue",
      "new_id": "731c7b8c7e41af7010e118e83cd9a47bf8aa8d13",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/dynamicConfig/index.vue"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "de13c4fbdd5056e2f112acf2520d510ef334e1da",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/dynamicConfig/model/ConfigModel.spec.ts"
    },
    {
      "type": "modify",
      "old_id": "ec9e1c81b758f320aa2485c1065b937430ce7344",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/dynamicConfig/model/ConfigModel.ts",
      "new_id": "61e4cfde8c93bde2b1a44b1fdd10aa4470c7560a",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/dynamicConfig/model/ConfigModel.ts"
    },
    {
      "type": "modify",
      "old_id": "df8ea52574267d628c09f6b688be566284772edd",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/dynamicConfig/tabs/YAMLView.vue",
      "new_id": "3e24e0dd76ca65764f0a255267c98ce15fadf8dc",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/dynamicConfig/tabs/YAMLView.vue"
    },
    {
      "type": "modify",
      "old_id": "f01a11f7293b6da3314ab23b16bfda2c09bc2e28",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/dynamicConfig/tabs/addByFormView.vue",
      "new_id": "acb136cfa4c2ffc2726be0955721a9200f41ade1",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/dynamicConfig/tabs/addByFormView.vue"
    },
    {
      "type": "modify",
      "old_id": "bc4595e0b96318ce072521a51ea9a1061ff01b70",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/dynamicConfig/tabs/formView.vue",
      "new_id": "8402bca622dbfc7857ce7b3bfd3f0e741f978adc",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/dynamicConfig/tabs/formView.vue"
    },
    {
      "type": "modify",
      "old_id": "e67ad249d77df71d2419170f0ff4a481f3807b7e",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/routingRule/index.vue",
      "new_id": "eb111b95b525d5d58114adf1c6ef0dad4edac39e",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/routingRule/index.vue"
    },
    {
      "type": "modify",
      "old_id": "dd5adb2c60c6155dc3590e615e7db1e284d212a6",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/routingRule/tabs/addByFormView.vue",
      "new_id": "180ba501d88ad0eef8ee109b63414b766b3b6ddf",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/routingRule/tabs/addByFormView.vue"
    },
    {
      "type": "modify",
      "old_id": "cb9dfdcc5a65d2e6a866853817ced6df049bab2a",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/routingRule/tabs/addByYAMLView.vue",
      "new_id": "e7465d3320c76d5f4becb148e7350b59e629ce15",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/routingRule/tabs/addByYAMLView.vue"
    },
    {
      "type": "modify",
      "old_id": "fb42ce90846674c9ef242d647e2ee40e45a113a3",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/routingRule/tabs/formView.vue",
      "new_id": "562ec7354c018ef08ec5eb659e54af471ec974c1",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/routingRule/tabs/formView.vue"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "71163c6ddca487af3e09e7805b82b72ad078f22c",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/routingRule/tabs/updateByFormView.spec.ts"
    },
    {
      "type": "modify",
      "old_id": "42795adef8774a52602f0b47b306285868f05b43",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/routingRule/tabs/updateByFormView.vue",
      "new_id": "fd58df43cd54f4845b0adca7d108936d9b2729e2",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/routingRule/tabs/updateByFormView.vue"
    },
    {
      "type": "modify",
      "old_id": "435a3a686fe332afe79d3040a27d7959d1df55ff",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/routingRule/tabs/updateByYAMLView.vue",
      "new_id": "0ce0138f9894b56cd0ceb957a2d1b5caada9fe5a",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/routingRule/tabs/updateByYAMLView.vue"
    },
    {
      "type": "modify",
      "old_id": "e726c6e193d404abdc5f1e8f80972025823e58c7",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/tagRule/index.vue",
      "new_id": "7ab9f9639b2502db179764a725b7bf78ac83638a",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/tagRule/index.vue"
    },
    {
      "type": "modify",
      "old_id": "b10b6b6c8a8fd8eb2aedb154d5975b95c1cc1fda",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/tagRule/tabs/addByFormView.vue",
      "new_id": "a9d4fe33298271926929d5bde1feb8cb7241701e",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/tagRule/tabs/addByFormView.vue"
    },
    {
      "type": "modify",
      "old_id": "2552413a86a8d0bce47bd1ac64ebee4f7944ad36",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/tagRule/tabs/addByYAMLView.vue",
      "new_id": "94deb2bef169108fb70ba1340c75b6b9e08d99eb",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/tagRule/tabs/addByYAMLView.vue"
    },
    {
      "type": "modify",
      "old_id": "b37e0eb17391d2ffb5da20c1b6088e996697907a",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/tagRule/tabs/formView.vue",
      "new_id": "888a128b95f62dc719dd4cd9055f7ce57921b0fe",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/tagRule/tabs/formView.vue"
    },
    {
      "type": "modify",
      "old_id": "3c11272cf3937b59bbfdd45a3dded52c163ebd6f",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/tagRule/tabs/updateByFormView.vue",
      "new_id": "2405ae79910a8540303e229eccf93344ef8c8ecc",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/tagRule/tabs/updateByFormView.vue"
    },
    {
      "type": "modify",
      "old_id": "d50cbbc823bb51615e39d6701ad16afd690f2e29",
      "old_mode": 33188,
      "old_path": "ui-vue3/src/views/traffic/tagRule/tabs/updateByYAMLView.vue",
      "new_id": "403e01f668090789106cf08fa4278a5de9d4a023",
      "new_mode": 33188,
      "new_path": "ui-vue3/src/views/traffic/tagRule/tabs/updateByYAMLView.vue"
    }
  ]
}
