Ctrl K
ComunidadGuías…

test-manifest.json

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
{
  "version": 1,
  "repo": "rainbond",
  "capabilities": [
    {
      "id": "rainbond.api-gateway.vm-nodeport-service-uses-local-external-traffic-policy",
      "title": "Use Local externalTrafficPolicy for VM NodePort services",
      "title_zh": "Use Local externalTrafficPolicy for VM NodePort services",
      "interface_type": "handler_method",
      "interface": "api.controller.apigateway.Struct.CreateTCPRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestCreateTCPRouteSetsExternalTrafficPolicyLocalForVMService"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.api.apiserver-request-metrics",
      "title": "Collect missing API server request counters through existing rbd-api metrics",
      "title_zh": "Collect missing API server request counters through existing rbd-api metrics",
      "interface_type": "workflow",
      "interface": "api/metric.NewAPIServerCollector",
      "code_paths": [
        "api/metric/apiserver.go",
        "api/server/api.go",
        "api/client/prometheus/prometheus.go"
      ],
      "tests": [
        {
          "path": "api/metric/apiserver_test.go"
        },
        {
          "path": "api/client/prometheus/prometheus_timeout_test.go",
          "selector": "TestGetMetricHonorsCallerDeadline"
        },
        {
          "path": "api/client/prometheus/prometheus_timeout_test.go",
          "selector": "TestGetMetricCallerContextPreservesSuccessfulResults"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.api.kubeblocks.adapter-service-namespace",
      "title": "KubeBlocks adapter service namespace",
      "title_zh": "KubeBlocks adapter service namespace",
      "interface_type": "handler_method",
      "interface": "api/controller.KubeBlocksController.forwardRequest",
      "code_paths": [
        "api/controller/kubeblocks.go"
      ],
      "tests": [
        {
          "path": "api/controller/kubeblocks_test.go",
          "selector": "TestKubeBlocksAdapterBaseURLUsesPluginNamespace"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.api.kubeblocks.backup-repo-mutation-proxy",
      "title": "KubeBlocks backup repo mutation proxy",
      "title_zh": "KubeBlocks backup repo mutation proxy",
      "interface_type": "handler_method",
      "interface": "api/controller.KubeBlocksController.CreateBackupRepo",
      "code_paths": [
        "api/controller/kubeblocks.go"
      ],
      "tests": [
        {
          "path": "api/controller/kubeblocks_test.go",
          "selector": "TestKubeBlocksBackupRepoMutationProxy"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-backup.metadata-version-detect",
      "title": "Detect legacy and new backup metadata schema versions",
      "title_zh": "\u8bc6\u522b\u65e7\u7248\u4e0e\u65b0\u7248\u5e94\u7528\u5907\u4efd\u5143\u6570\u636e\u7ed3\u6784",
      "interface_type": "workflow",
      "interface": "builder/exector.judgeMetadataVersion",
      "code_paths": [
        "builder/exector/groupapp_backup.go"
      ],
      "tests": [
        {
          "path": "builder/exector/groupapp_backup_test.go",
          "selector": "TestJudgeMetadataVersion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-backup.service-volume-archive",
      "title": "Archive service volume data into backup packages",
      "title_zh": "\u5c06\u670d\u52a1\u5377\u6570\u636e\u5f52\u6863\u4e3a\u5907\u4efd\u5305",
      "interface_type": "workflow",
      "interface": "builder/exector.BackupAPPNew.backupServiceInfo",
      "code_paths": [
        "builder/exector/groupapp_backup.go"
      ],
      "tests": [
        {
          "path": "builder/exector/groupapp_backup_test.go",
          "selector": "TestBackupServiceVolume"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-backup.upload-package",
      "title": "Upload backup package to external storage",
      "title_zh": "\u5c06\u5e94\u7528\u5907\u4efd\u5305\u4e0a\u4f20\u5230\u5916\u90e8\u5b58\u50a8",
      "interface_type": "workflow",
      "interface": "builder/exector.BackupAPPNew.uploadPkg",
      "code_paths": [
        "builder/exector/groupapp_backup.go"
      ],
      "tests": [
        {
          "path": "builder/exector/groupapp_backup_test.go",
          "selector": "TestUploadPkg"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.app-backup.upload-package-download-guard",
      "title": "Guard removed download API during backup package upload flow",
      "title_zh": "\u5728\u5907\u4efd\u5305\u4e0a\u4f20\u6d41\u7a0b\u4e2d\u4fdd\u62a4\u5df2\u79fb\u9664\u7684\u4e0b\u8f7d\u63a5\u53e3",
      "interface_type": "workflow",
      "interface": "builder/exector.BackupAPPNew.uploadPkg",
      "code_paths": [
        "builder/exector/groupapp_backup.go"
      ],
      "tests": [
        {
          "path": "builder/exector/groupapp_backup_test.go",
          "selector": "TestUploadPkg2"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.app-backup.volume-dir-defaults",
      "title": "Resolve local and shared backup volume directories from environment",
      "title_zh": "\u6839\u636e\u73af\u5883\u53d8\u91cf\u89e3\u6790\u672c\u5730\u4e0e\u5171\u4eab\u5907\u4efd\u5377\u76ee\u5f55",
      "interface_type": "workflow",
      "interface": "builder/exector.GetVolumeDir",
      "code_paths": [
        "builder/exector/groupapp_backup.go"
      ],
      "tests": [
        {
          "path": "builder/exector/groupapp_backup_test.go",
          "selector": "TestGetVolumeDir"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-config-group.bind-component",
      "title": "Bind component to app config group",
      "title_zh": "\u5c06\u7ec4\u4ef6\u7ed1\u5b9a\u5230\u5e94\u7528\u914d\u7f6e\u7ec4",
      "interface_type": "dao_method",
      "interface": "db/mysql/dao.AppConfigGroupServiceDaoImpl.AddModel",
      "code_paths": [
        "db/mysql/dao/application_config_group.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/application_config_group_test.go",
          "selector": "TestAppConfigGroupServiceDaoAddModel"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-config-group.create",
      "title": "Create app config group record",
      "title_zh": "\u521b\u5efa\u5e94\u7528\u914d\u7f6e\u7ec4\u8bb0\u5f55",
      "interface_type": "dao_method",
      "interface": "db/mysql/dao.AppConfigGroupDaoImpl.AddModel",
      "code_paths": [
        "db/mysql/dao/application_config_group.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/application_config_group_test.go",
          "selector": "TestAppConfigGroupDaoAddModel"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-config-group.delete",
      "title": "Delete app config group record",
      "title_zh": "\u5220\u9664\u5e94\u7528\u914d\u7f6e\u7ec4\u8bb0\u5f55",
      "interface_type": "dao_method",
      "interface": "db/mysql/dao.AppConfigGroupDaoImpl.DeleteConfigGroup",
      "code_paths": [
        "db/mysql/dao/application_config_group.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/application_config_group_test.go",
          "selector": "TestDeleteConfigGroup"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-config-group.get",
      "title": "Query app config group record",
      "title_zh": "\u67e5\u8be2\u5e94\u7528\u914d\u7f6e\u7ec4\u8bb0\u5f55",
      "interface_type": "dao_method",
      "interface": "db/mysql/dao.AppConfigGroupDaoImpl.GetConfigGroupByID",
      "code_paths": [
        "db/mysql/dao/application_config_group.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/application_config_group_test.go",
          "selector": "TestAppGetConfigGroupByID"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-config-group.item-create",
      "title": "Create app config group item",
      "title_zh": "\u521b\u5efa\u5e94\u7528\u914d\u7f6e\u9879",
      "interface_type": "dao_method",
      "interface": "db/mysql/dao.AppConfigGroupItemDaoImpl.AddModel",
      "code_paths": [
        "db/mysql/dao/application_config_group.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/application_config_group_test.go",
          "selector": "TestAppConfigGroupItemDaoAddModel"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-config-group.item-delete",
      "title": "Delete app config group item",
      "title_zh": "\u5220\u9664\u5e94\u7528\u914d\u7f6e\u9879",
      "interface_type": "dao_method",
      "interface": "db/mysql/dao.AppConfigGroupItemDaoImpl.DeleteConfigGroupItem",
      "code_paths": [
        "db/mysql/dao/application_config_group.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/application_config_group_test.go",
          "selector": "TestDeleteConfigGroupItem"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-config-group.item-update",
      "title": "Update app config group item",
      "title_zh": "\u66f4\u65b0\u5e94\u7528\u914d\u7f6e\u9879",
      "interface_type": "dao_method",
      "interface": "db/mysql/dao.AppConfigGroupItemDaoImpl.UpdateModel",
      "code_paths": [
        "db/mysql/dao/application_config_group.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/application_config_group_test.go",
          "selector": "TestAppConfigGroupItemDaoUpdateModel"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-config-group.pending-component-bindings",
      "title": "Preserve configuration bindings before component creation",
      "title_zh": "Preserve configuration bindings before component creation",
      "interface_type": "handler_method",
      "interface": "api/handler.ApplicationAction.AddConfigGroup/UpdateConfigGroup",
      "code_paths": [
        "api/handler/application_config_group.go",
        "worker/appm/conversion/configgroup.go"
      ],
      "tests": [
        {
          "path": "api/handler/application_config_group_test.go",
          "selector": "TestConfigGroupRetainsPendingComponentBindings"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-config-group.unbind-components",
      "title": "Remove component bindings from app config group",
      "title_zh": "\u79fb\u9664\u5e94\u7528\u914d\u7f6e\u7ec4\u7ec4\u4ef6\u7ed1\u5b9a",
      "interface_type": "dao_method",
      "interface": "db/mysql/dao.AppConfigGroupServiceDaoImpl.DeleteConfigGroupService",
      "code_paths": [
        "db/mysql/dao/application_config_group.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/application_config_group_test.go",
          "selector": "TestDeleteConfigGroupService"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-import.package-name-normalize",
      "title": "Normalize imported image package names from linux file names",
      "title_zh": "\u4ece Linux \u6587\u4ef6\u540d\u8fd8\u539f\u5bfc\u5165\u955c\u50cf\u5305\u540d",
      "interface_type": "workflow",
      "interface": "builder/exector.buildFromLinuxFileName",
      "code_paths": [
        "builder/exector/import_app.go"
      ],
      "tests": [
        {
          "path": "builder/exector/import_app_test.go",
          "selector": "TestBuildFromLinuxFileName"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-import.propagate-image-push-error",
      "title": "Return imported image push errors during app import",
      "interface_type": "workflow",
      "interface": "builder/exector.ensureImportedImagesPushed",
      "code_paths": [
        "builder/exector/import_app.go"
      ],
      "tests": [
        {
          "path": "builder/exector/import_app_test.go",
          "selector": "TestEnsureImportedImagesPushedReturnsPushError"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-import.propagate-task-error",
      "title": "Return app import task errors to the import worker",
      "interface_type": "workflow",
      "interface": "builder/exector.runImportAppTasks",
      "code_paths": [
        "builder/exector/import_app.go"
      ],
      "tests": [
        {
          "path": "builder/exector/import_app_test.go",
          "selector": "TestRunImportAppTasksReturnsTaskError"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-import.scaling-rule-compat",
      "title": "Preserve legacy scaling rules during app import",
      "title_zh": "\u5bfc\u5165\u5e94\u7528\u65f6\u4fdd\u7559\u65e7\u7248\u4f38\u7f29\u89c4\u5219",
      "interface_type": "workflow",
      "interface": "builder/exector.normalizeImportedRAM",
      "code_paths": [
        "builder/exector/import_app.go"
      ],
      "tests": [
        {
          "path": "builder/exector/import_app_test.go",
          "selector": "TestNormalizeImportedRAMPreservesLegacyScalingRule"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-import.status-serialization",
      "title": "Serialize and parse per-app import status maps",
      "title_zh": "\u5e8f\u5217\u5316\u5e76\u89e3\u6790\u6309\u5e94\u7528\u8bb0\u5f55\u7684\u5bfc\u5165\u72b6\u6001",
      "interface_type": "workflow",
      "interface": "builder/exector.map2str",
      "code_paths": [
        "builder/exector/import_app.go"
      ],
      "tests": [
        {
          "path": "builder/exector/import_app_test.go",
          "selector": "TestAppStatusMapRoundTrip"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-import.wait-image-push",
      "title": "Wait for imported component and plugin images to be pushed",
      "interface_type": "workflow",
      "interface": "builder/exector.ensureImportedImagesPushed",
      "code_paths": [
        "builder/exector/import_app.go"
      ],
      "tests": [
        {
          "path": "builder/exector/import_app_test.go",
          "selector": "TestEnsureImportedImagesPushedPushesComponentsAndPluginsOnce"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-restore.image-registry-rewrite",
      "title": "Rewrite image registry during app restore",
      "title_zh": "\u5e94\u7528\u6062\u590d\u65f6\u91cd\u5199\u955c\u50cf\u4ed3\u5e93\u5730\u5740",
      "interface_type": "workflow",
      "interface": "builder/exector.getNewImageName",
      "code_paths": [
        "builder/exector/groupapp_restore.go"
      ],
      "tests": [
        {
          "path": "builder/exector/groupapp_restore_test.go",
          "selector": "TestGetImageName"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-restore.service-id-lookup",
      "title": "Resolve original service ids from restored service mappings",
      "title_zh": "\u4ece\u6062\u590d\u540e\u7684\u670d\u52a1\u6620\u5c04\u4e2d\u53cd\u67e5\u539f\u59cb\u670d\u52a1 ID",
      "interface_type": "workflow",
      "interface": "builder/exector.BackupAPPRestore.getOldServiceID",
      "code_paths": [
        "builder/exector/groupapp_restore.go"
      ],
      "tests": [
        {
          "path": "builder/exector/groupapp_restore_test.go",
          "selector": "TestGetOldServiceID"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-restore.snapshot-relationship-rewrite",
      "title": "Rewrite service relationships during app restore",
      "title_zh": "\u5e94\u7528\u6062\u590d\u65f6\u91cd\u5199\u670d\u52a1\u4f9d\u8d56\u5173\u7cfb",
      "interface_type": "workflow",
      "interface": "builder/exector.BackupAPPRestore.modify",
      "code_paths": [
        "builder/exector/groupapp_restore.go"
      ],
      "tests": [
        {
          "path": "builder/exector/groupapp_restore_test.go",
          "selector": "TestModify"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-restore.unzip-all-data",
      "title": "Unzip full backup data archive during restore",
      "title_zh": "\u5728\u6062\u590d\u65f6\u89e3\u538b\u5b8c\u6574\u5907\u4efd\u6570\u636e\u5305",
      "interface_type": "workflow",
      "interface": "builder/exector.BackupAPPRestore",
      "code_paths": [
        "builder/exector/groupapp_restore.go"
      ],
      "tests": [
        {
          "path": "builder/exector/groupapp_restore_test.go",
          "selector": "TestUnzipAllDataFile"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.app-upgrade.cross-app-config-mount",
      "title": "Preserve cross-application config-file mounts during upgrade",
      "title_zh": "Preserve cross-application config-file mounts during upgrade",
      "interface_type": "handler_method",
      "interface": "api/handler.ServiceAction.SyncComponentVolumeRels",
      "code_paths": [
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_sync_volume_relations_test.go",
          "selector": "TestSyncComponentVolumeRelsPreservesCrossApplicationConfigFileMount"
        },
        {
          "path": "api/handler/service_sync_volume_relations_test.go",
          "selector": "TestSyncComponentVolumeRelsRejectsInvalidExternalProviders"
        },
        {
          "path": "api/handler/service_sync_volume_relations_test.go",
          "selector": "TestSyncComponentVolumeRelsReturnsExternalProviderLookupError"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.application.check-port-k8s-service-name-duplicate",
      "title": "Reject duplicate Kubernetes service names across app ports",
      "title_zh": "\u6821\u9a8c\u5e94\u7528\u7aef\u53e3 Kubernetes Service \u540d\u79f0\u91cd\u590d",
      "interface_type": "handler_method",
      "interface": "api/handler.ApplicationAction.checkPorts",
      "code_paths": [
        "api/handler/application_handler.go"
      ],
      "tests": [
        {
          "path": "api/handler/application_handler_test.go",
          "selector": "TestApplicationActionCheckPortsRejectsDuplicateK8sServiceName"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.application.delete-config-secrets",
      "title": "Delete config group Secrets with applications",
      "title_zh": "Delete config group Secrets with applications",
      "interface_type": "handler_method",
      "interface": "api/handler.ApplicationAction.deleteApplicationConfigSecrets",
      "code_paths": [
        "api/handler/application_handler.go",
        "api/handler/application_config_group.go"
      ],
      "tests": [
        {
          "path": "api/handler/application_handler_test.go",
          "selector": "TestApplicationActionDeleteApplicationConfigSecrets"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.build.select-builder-by-language",
      "title": "Select builder implementation by source language and build type",
      "title_zh": "\u6309\u6e90\u7801\u8bed\u8a00\u548c\u6784\u5efa\u7c7b\u578b\u9009\u62e9\u6784\u5efa\u5668",
      "interface_type": "workflow",
      "interface": "builder/build.GetBuildByType",
      "code_paths": [
        "builder/build/build.go"
      ],
      "tests": [
        {
          "path": "builder/build/build_type_matrix_test.go",
          "selector": "TestGetBuildByType_SourceBuildLanguageMatrix"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.builder.build-pod-resources",
      "title": "Build pod CPU and memory from chaos environment",
      "title_zh": "Chaos \u73af\u5883\u53d8\u91cf\u63a7\u5236\u6784\u5efa Pod CPU \u548c\u5185\u5b58",
      "interface_type": "workflow",
      "interface": "builder/job.controller.ExecJob",
      "code_paths": [
        "builder/job/job.go",
        "builder/job/resources.go"
      ],
      "tests": [
        {
          "path": "builder/job/resources_test.go",
          "selector": "TestApplyBuildPodResourcesFromEnv"
        },
        {
          "path": "builder/job/resources_test.go",
          "selector": "TestApplyBuildPodResourcesRejectsInvalidConfig"
        },
        {
          "path": "builder/job/resources_test.go",
          "selector": "TestExecJobAppliesResourcesBeforeCreate"
        },
        {
          "path": "builder/job/resources_test.go",
          "selector": "TestExecJobReusesExistingPodWithoutApplyingResources"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.builder.dynamic-mirror-config",
      "title": "Dynamic mirror config defaults and env overrides",
      "title_zh": "Dynamic mirror config defaults and env overrides",
      "interface_type": "workflow",
      "interface": "builder/mirror.LoadConfig",
      "code_paths": [
        "builder/mirror/config.go"
      ],
      "tests": [
        {
          "path": "builder/mirror/config_test.go",
          "selector": "TestLoadConfigDefaults"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.builder.dynamic-mirror-fetch",
      "title": "Fetch mirror candidates from remote JSON source with schema validation",
      "title_zh": "Fetch mirror candidates from remote JSON source with schema validation",
      "interface_type": "workflow",
      "interface": "builder/mirror.FetchCandidates",
      "code_paths": [
        "builder/mirror/fetcher.go"
      ],
      "tests": [
        {
          "path": "builder/mirror/fetcher_test.go",
          "selector": "TestFetchCandidates"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.builder.dynamic-mirror-fetch-fallback",
      "title": "Mirror source fetch falls back to next URL on failure",
      "title_zh": "Mirror source fetch falls back to next URL on failure",
      "interface_type": "workflow",
      "interface": "builder/mirror.FetchCandidates",
      "code_paths": [
        "builder/mirror/fetcher.go"
      ],
      "tests": [
        {
          "path": "builder/mirror/fetcher_test.go",
          "selector": "TestFetchCandidatesFallsBackToNextURL"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.builder.dynamic-mirror-probe",
      "title": "Probe filters dead mirrors and sorts alive ones by latency",
      "title_zh": "Probe filters dead mirrors and sorts alive ones by latency",
      "interface_type": "workflow",
      "interface": "builder/mirror.Probe",
      "code_paths": [
        "builder/mirror/prober.go"
      ],
      "tests": [
        {
          "path": "builder/mirror/prober_test.go",
          "selector": "TestProbeFiltersAndSortsByLatency"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.builder.dynamic-mirror-refresh",
      "title": "Mirror manager refresh updates list and persists configmap",
      "title_zh": "Mirror manager refresh updates list and persists configmap",
      "interface_type": "workflow",
      "interface": "builder/mirror.Manager.Refresh",
      "code_paths": [
        "builder/mirror/manager.go"
      ],
      "tests": [
        {
          "path": "builder/mirror/manager_test.go",
          "selector": "TestManagerRefreshUpdatesMirrorsAndConfigMap"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.builder.dynamic-mirror-restore",
      "title": "Mirror manager restores last good list from configmap",
      "title_zh": "Mirror manager restores last good list from configmap",
      "interface_type": "workflow",
      "interface": "builder/mirror.Manager.restore",
      "code_paths": [
        "builder/mirror/manager.go"
      ],
      "tests": [
        {
          "path": "builder/mirror/manager_test.go",
          "selector": "TestManagerRestoreFromConfigMap"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.builder.mirror-containerd-hosts",
      "title": "containerd pulls try docker.io mirrors first with upstream fallback",
      "title_zh": "containerd pulls try docker.io mirrors first with upstream fallback",
      "interface_type": "workflow",
      "interface": "builder/sources.mirrorRegistryHosts",
      "code_paths": [
        "builder/sources/mirror_hosts.go"
      ],
      "tests": [
        {
          "path": "builder/sources/mirror_hosts_test.go",
          "selector": "TestMirrorRegistryHosts"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.builder.mirror-docker-ref-rewrite",
      "title": "docker daemon pulls rewrite docker.io refs to mirrors with fallback order",
      "title_zh": "docker daemon pulls rewrite docker.io refs to mirrors with fallback order",
      "interface_type": "workflow",
      "interface": "builder/sources.mirrorPullRefs",
      "code_paths": [
        "builder/sources/mirror_hosts.go"
      ],
      "tests": [
        {
          "path": "builder/sources/mirror_hosts_test.go",
          "selector": "TestMirrorPullRefs"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.builder.mirror-merge-manual-priority",
      "title": "Manual REGISTRY_MIRRORS take priority over dynamic mirrors with host dedup",
      "title_zh": "Manual REGISTRY_MIRRORS take priority over dynamic mirrors with host dedup",
      "interface_type": "workflow",
      "interface": "builder/sources.mergeMirrors",
      "code_paths": [
        "builder/sources/mirror_merge.go"
      ],
      "tests": [
        {
          "path": "builder/sources/mirror_merge_test.go",
          "selector": "TestMergeMirrors"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.builder.registered-worker-dispatch",
      "title": "Dispatch registered worker tasks without unknown warnings",
      "title_zh": "\u5df2\u6ce8\u518c worker \u5206\u53d1\u65f6\u4e0d\u518d\u8bef\u62a5\u672a\u77e5\u4efb\u52a1",
      "interface_type": "workflow",
      "interface": "builder/exector.exectorManager.RunTask",
      "code_paths": [
        "builder/exector/exector.go"
      ],
      "tests": [
        {
          "path": "builder/exector/exector_test.go",
          "selector": "TestRunTaskDoesNotWarnForRegisteredWorker"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.builder.source-type-compatibility",
      "title": "Normalize blank source build types without changing explicit protocols",
      "title_zh": "Normalize blank source build types without changing explicit protocols",
      "interface_type": "workflow",
      "interface": "builder/exector.NewSouceCodeBuildItem",
      "code_paths": [
        "builder/exector/build_from_sourcecode_run.go"
      ],
      "tests": [
        {
          "path": "builder/exector/source_server_type_test.go",
          "selector": "TestNewSourceBuildServerType"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.activation-registry-coordination",
      "title": "Rollback and activation cannot reference deleting images",
      "title_zh": "Rollback and activation cannot reference deleting images",
      "interface_type": "workflow",
      "interface": "cleanup.TrackServiceActivation",
      "code_paths": [
        "pkg/cleanup/activation.go",
        "pkg/cleanup/store.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/activation_coordination_test.go",
          "selector": "TestActivationAndRollbackRejectDeletingImage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.app-import-admission",
      "title": "Hold application import admission through metadata publication",
      "title_zh": "Hold application import admission through metadata publication",
      "interface_type": "workflow",
      "interface": "exector.exec.import_app",
      "code_paths": [
        "builder/exector/exector.go",
        "builder/exector/import_app.go",
        "builder/exector/cleanup_image_admission.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_import_admission_test.go",
          "selector": "TestImportWorkerHoldsAdmissionUntilPublication"
        },
        {
          "path": "builder/exector/cleanup_import_admission_test.go",
          "selector": "TestImportSuccessWaitsForMetadataUpload"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.cache-builder-startup",
      "title": "Enroll actual cache writer before task consumption",
      "title_zh": "Enroll actual cache writer before task consumption",
      "interface_type": "workflow",
      "interface": "exector.registerCacheBuilderStartup",
      "code_paths": [
        "builder/exector/cleanup_cache_startup.go",
        "builder/exector/exector.go",
        "pkg/cleanup/kubeidentity/cache_builder.go",
        "pkg/cleanup/node_readiness.go",
        "pkg/cleanup/participant.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_cache_startup_test.go",
          "selector": "TestCacheStartupRegistersActualInstanceWithoutEnablingDeletion"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.cache-observation-before-readiness",
      "title": "Observe cache storage without enabling legacy writer deletion",
      "title_zh": "Observe cache storage without enabling legacy writer deletion",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectManagedBuildCacheSource",
      "code_paths": [
        "pkg/cleanup/kubeidentity/managed_cache.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/managed_cache_test.go",
          "selector": "TestReadOnlyCacheEnrollmentDoesNotRequireDeletionReadiness"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.cache-writer-certification",
      "title": "Certify cache readiness only with current membership and no writers",
      "title_zh": "Certify cache readiness only with current membership and no writers",
      "interface_type": "workflow",
      "interface": "cleanup.CertifyManagedCacheWriters",
      "code_paths": [
        "pkg/cleanup/cache_certification.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/cache_certification_test.go",
          "selector": "TestCacheCertificationRequiresMembershipAndQuiescence"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.cache-writer-coverage",
      "title": "Verify current coordinated writer rollout and detached builds",
      "title_zh": "Verify current coordinated writer rollout and detached builds",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectCacheWriterCoverage",
      "code_paths": [
        "pkg/cleanup/kubeidentity/cache_coverage.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/cache_coverage_test.go",
          "selector": "TestCacheCoverageRejectsRollingWritersAndDetachedBuilds"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.cache-writer-native-gate",
      "title": "Recheck live writer coverage before native deletion grant",
      "title_zh": "Recheck live writer coverage before native deletion grant",
      "interface_type": "view_endpoint",
      "interface": "POST node/enter-job",
      "code_paths": [
        "api/controller/cleanup_cache_readiness.go",
        "api/controller/cleanup_node_launch.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_node_executor_test.go",
          "selector": "TestNodeAdmissionAPIUsesKubernetesFactsAndGrantsOnce"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.configured-node-helper-references",
      "title": "Protect configured executor images across API rollout and rollback",
      "title_zh": "Protect configured executor images across API rollout and rollback",
      "interface_type": "workflow",
      "interface": "kubeidentity.ReadAPIHelperReferences",
      "code_paths": [
        "pkg/cleanup/kubeidentity/helper_references.go",
        "pkg/cleanup/reference_audit.go",
        "api/controller/cleanup_coordination.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/reference_audit_test.go",
          "selector": "TestConfiguredHelperImagesRemainProtectedWithoutRunningPods"
        },
        {
          "path": "pkg/cleanup/kubeidentity/helper_references_test.go",
          "selector": "TestAPIHelperReferencesIncludeDesiredRollbackAndRunningImages"
        },
        {
          "path": "pkg/cleanup/kubeidentity/helper_references_test.go",
          "selector": "TestAPIHelperDoesNotReadSecretBackedEnvironment"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.console-signed-coordinator",
      "title": "Use installation-scoped signatures for coordinator requests",
      "title_zh": "Use installation-scoped signatures for coordinator requests",
      "interface_type": "package_function",
      "interface": "cleanup.NewConsoleCoordinationClient",
      "code_paths": [
        "pkg/cleanup/console_coordination.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/console_coordination_test.go",
          "selector": "TestConsoleCoordinationUsesScopedSignatureWithoutAdminCredential"
        },
        {
          "path": "pkg/cleanup/console_coordination_test.go",
          "selector": "TestConsoleCoordinationRejectsUnsafeScopePathsAndDoesNotRetry"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.console-signed-coordinator-runtime",
      "title": "Run signed coordinator with an independent permit key",
      "title_zh": "Run signed coordinator with an independent permit key",
      "interface_type": "workflow",
      "interface": "registry-coordinator.run",
      "code_paths": [
        "cmd/registry-coordinator/main.go",
        "cmd/registry-coordinator/credentials.go"
      ],
      "tests": [
        {
          "path": "cmd/registry-coordinator/main_test.go",
          "selector": "TestCoordinatorUsesSignedConsoleAndIndependentPermitKey"
        },
        {
          "path": "cmd/registry-coordinator/main_test.go",
          "selector": "TestSignedCoordinatorRejectsSharedOrMissingPermitKey"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.console-signed-gc-command",
      "title": "Authenticate original GC callbacks with installation signatures",
      "title_zh": "Authenticate original GC callbacks with installation signatures",
      "interface_type": "workflow",
      "interface": "registry-gc.runGC",
      "code_paths": [
        "cmd/registry-gc/main.go"
      ],
      "tests": [
        {
          "path": "cmd/registry-gc/main_test.go",
          "selector": "TestGCCommandUsesInstallationSignatureForOriginalReceipt"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.console-writer-announcement",
      "title": "Authenticate Console announcements and bind observed runtime identity",
      "title_zh": "Authenticate Console announcements and bind observed runtime identity",
      "interface_type": "workflow",
      "interface": "CleanupCoordinationHandler.RegisterConsoleReferenceWriter",
      "code_paths": [
        "api/controller/cleanup_reference_writer.go",
        "api/api_routers/version2/v2Routers.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_reference_writer_test.go",
          "selector": "TestConsoleWriterAnnouncementRequiresAuthenticationAndObservedIdentity"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.coordinated-registry-delete-gc",
      "title": "Verify coordinated deletion and separate GC against isolated real Registry",
      "title_zh": "Verify coordinated deletion and separate GC against isolated real Registry",
      "interface_type": "workflow",
      "interface": "Region coordination API and Registry sidecar",
      "code_paths": [
        "pkg/cleanup/registryproxy/coordinator.go",
        "api/controller/cleanup_coordination.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_registryproxy_test.go",
          "selector": "TestCoordinatedRegistryRealDeletionAndGC"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.coordination-route-auth",
      "title": "Require Region authentication for every coordination route",
      "title_zh": "Require Region authentication for every coordination route",
      "interface_type": "view_endpoint",
      "interface": "/v2/cleanup/stores/{storage_id}/operations",
      "code_paths": [
        "api/api_routers/version2/v2Routers.go"
      ],
      "tests": [
        {
          "path": "api/api_routers/version2/cleanup_coordination_test.go",
          "selector": "TestCleanupCoordinationRoutesAlwaysRequireRegionAuthentication"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.coordinator-runtime",
      "title": "Run verified readiness and terminate the coordinator cleanly",
      "title_zh": "Run verified readiness and terminate the coordinator cleanly",
      "interface_type": "workflow",
      "interface": "cmd/registry-coordinator.run",
      "code_paths": [
        "cmd/registry-coordinator/main.go"
      ],
      "tests": [
        {
          "path": "cmd/registry-coordinator/main_test.go",
          "selector": "TestCoordinatorRunsReadinessAndStopsWithContext"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.deferred-helmapp-references",
      "title": "Require settled HelmApp intent covered by retained release evidence",
      "title_zh": "Require settled HelmApp intent covered by retained release evidence",
      "interface_type": "workflow",
      "interface": "kubeidentity.ReadHelmAppReferenceInventory",
      "code_paths": [
        "pkg/cleanup/kubeidentity/helmapp_references.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/helmapp_references_test.go",
          "selector": "TestHelmAppReferencesRequireSettledRelease"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.durable-coordination",
      "title": "Persist coordinated operations across restarts and conflicts",
      "title_zh": "Persist coordinated operations across restarts and conflicts",
      "interface_type": "workflow",
      "interface": "pkg/cleanup.AcquireOperation",
      "code_paths": [
        "pkg/cleanup/coordination.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/coordination_test.go",
          "selector": "TestPersistentCoordinationConflictsAndRecovery"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.durable-gc-receipt",
      "title": "Recover only immutable GC execution evidence without replay",
      "title_zh": "Recover only immutable GC execution evidence without replay",
      "interface_type": "workflow",
      "interface": "registryproxy.RecoverGCReceipt",
      "code_paths": [
        "pkg/cleanup/registryproxy/gc_receipt.go",
        "pkg/cleanup/registryproxy/gc_executor.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/registryproxy/gc_receipt_test.go",
          "selector": "TestGCReceiptIsBoundImmutableAndDoesNotPermitReplay"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.durable-maintenance-measurements",
      "title": "Persist GC measurements without releasing maintenance protection",
      "title_zh": "Persist GC measurements without releasing maintenance protection",
      "interface_type": "workflow",
      "interface": "cleanup.RecordMaintenanceMeasurement",
      "code_paths": [
        "pkg/cleanup/maintenance_measurement.go",
        "pkg/cleanup/storage_measurement.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/maintenance_measurement_test.go",
          "selector": "TestMaintenanceMeasurementsPersistWithoutGrantingRestore"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.executor-preview-authority",
      "title": "Reject admission changes to native executor authority",
      "title_zh": "Reject admission changes to native executor authority",
      "interface_type": "workflow",
      "interface": "cleanup.sameExecutorPreview",
      "code_paths": [
        "pkg/cleanup/executor_preview.go",
        "pkg/cleanup/node_job_submit.go",
        "pkg/cleanup/gc_job_submit.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_job_submit_test.go",
          "selector": "TestNodeDryRunCannotChangeExecutorIdentity"
        },
        {
          "path": "pkg/cleanup/gc_job_submit_test.go",
          "selector": "TestGCPreviewCannotInjectLifecycleOrStorage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.expired-upload-reinitialize",
      "title": "Start a new session instead of resuming expired chunk metadata",
      "title_zh": "Start a new session instead of resuming expired chunk metadata",
      "interface_type": "workflow",
      "interface": "controller.ChunkUploadManager.InitUploadSession",
      "code_paths": [
        "api/controller/chunk_upload_manager.go"
      ],
      "tests": [
        {
          "path": "api/controller/chunk_upload_cleanup_test.go",
          "selector": "TestExpiredUploadStartsNewSessionInsteadOfResumingRemovedChunks"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.expired-upload-retirement",
      "title": "Retire original expired upload before one-shot chunk deletion and retain recovery evidence",
      "title_zh": "Retire original expired upload before one-shot chunk deletion and retain recovery evidence",
      "interface_type": "workflow",
      "interface": "DeleteExpiredUploadChunks",
      "code_paths": [
        "pkg/cleanup/upload_retirement.go",
        "db/model/package_upload_use.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/upload_retirement_test.go",
          "selector": "TestExpiredUploadDeletionRetiresSessionAndDoesNotReplay"
        },
        {
          "path": "pkg/cleanup/upload_retirement_test.go",
          "selector": "TestExpiredUploadDeletionRejectsChangedOrActiveEvidence"
        },
        {
          "path": "pkg/cleanup/upload_retirement_test.go",
          "selector": "TestInterruptedUploadRetirementDoesNotReplayAfterRestart"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.expired-upload-writes",
      "title": "Reject writes and completion on expired upload sessions",
      "title_zh": "Reject writes and completion on expired upload sessions",
      "interface_type": "workflow",
      "interface": "controller.ChunkUploadManager.SaveChunk",
      "code_paths": [
        "api/controller/chunk_upload_manager.go"
      ],
      "tests": [
        {
          "path": "api/controller/chunk_upload_cleanup_test.go",
          "selector": "TestExpiredUploadCannotContinueWriting"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-executor-command",
      "title": "Bind native GC command to the verified Job admission",
      "title_zh": "Bind native GC command to the verified Job admission",
      "interface_type": "workflow",
      "interface": "registry-gc.runGC",
      "code_paths": [
        "cmd/registry-gc/main.go"
      ],
      "tests": [
        {
          "path": "cmd/registry-gc/main_test.go",
          "selector": "TestGCCommandValidatesBeforeExecutionAndSeparatesRecovery"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-executor-identity",
      "title": "Verify GC pod ownership image and physical volume",
      "title_zh": "Verify GC pod ownership image and physical volume",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectGCExecutor",
      "code_paths": [
        "pkg/cleanup/kubeidentity/gc_executor.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/gc_executor_test.go",
          "selector": "TestGCExecutorIdentityRejectsUntrustedPodAndStorage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-executor-termination",
      "title": "Require actual original GC container termination and unchanged source",
      "title_zh": "Require actual original GC container termination and unchanged source",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectTerminatedGCExecutor",
      "code_paths": [
        "pkg/cleanup/kubeidentity/gc_executor.go",
        "pkg/cleanup/kubeidentity/gc_job_template.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/gc_executor_test.go",
          "selector": "TestTerminatedGCExecutorRequiresActualOriginalContainerExit"
        },
        {
          "path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
          "selector": "TestGCSourceFingerprintDetectsRuntimeAndConfigurationChanges"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-failed-before-admission",
      "title": "Cancel failed GC only before execution admission",
      "title_zh": "Cancel failed GC only before execution admission",
      "interface_type": "view_endpoint",
      "interface": "POST maintenance/job/cancel-failed",
      "code_paths": [
        "api/controller/cleanup_gc_restore.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_gc_failed_test.go",
          "selector": "TestFailedGCBeforeAdmissionCanEndMaintenanceWithoutDeletion"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-job-execution-api",
      "title": "Grant verified GC Job execution once after writer drain",
      "title_zh": "Grant verified GC Job execution once after writer drain",
      "interface_type": "view_endpoint",
      "interface": "POST maintenance/enter-job",
      "code_paths": [
        "api/controller/cleanup_gc_executor.go",
        "pkg/cleanup/gc_executor_client.go",
        "pkg/cleanup/registryproxy/gc_recorder.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_gc_executor_test.go",
          "selector": "TestGCJobAdmissionAPIRequiresVerifiedExecutorAndGrantsOnce"
        },
        {
          "path": "pkg/cleanup/registryproxy/gc_recorder_test.go",
          "selector": "TestGCJobRecorderUsesVerifiedGateWithoutFallback"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-job-progress",
      "title": "Expose only the bound GC operation receipt",
      "title_zh": "Expose only the bound GC operation receipt",
      "interface_type": "workflow",
      "interface": "cleanup.ReadGCJobProgress",
      "code_paths": [
        "pkg/cleanup/gc_job_progress.go",
        "api/controller/cleanup_gc_restore.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/gc_job_restore_test.go",
          "selector": "TestGCProgressRejectsAnotherOperationIdentity"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-job-restore",
      "title": "Restore only the original verified GC operation with durable measurements",
      "title_zh": "Restore only the original verified GC operation with durable measurements",
      "interface_type": "workflow",
      "interface": "cleanup.FinishGCJobRestore",
      "code_paths": [
        "pkg/cleanup/gc_job_restore.go",
        "api/controller/cleanup_gc_restore.go",
        "pkg/cleanup/maintenance.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/gc_job_restore_test.go",
          "selector": "TestGCJobRestoreRequiresOriginalBindingAndMeasurements"
        },
        {
          "path": "api/controller/cleanup_gc_executor_test.go",
          "selector": "TestGCJobAdmissionAPIRequiresVerifiedExecutorAndGrantsOnce"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-job-start",
      "title": "Start the recorded GC Job only after writer drain",
      "title_zh": "Start the recorded GC Job only after writer drain",
      "interface_type": "workflow",
      "interface": "cleanup.StartGCJob",
      "code_paths": [
        "pkg/cleanup/gc_job_start.go",
        "pkg/cleanup/maintenance.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/gc_job_start_test.go",
          "selector": "TestGCJobStartWaitsForWritersAndNeverReplaysLostStart"
        },
        {
          "path": "pkg/cleanup/gc_job_start_test.go",
          "selector": "TestGCJobStartRejectsCanceledOperation"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-job-submission",
      "title": "Persist GC submission and reconcile without replay",
      "title_zh": "Persist GC submission and reconcile without replay",
      "interface_type": "workflow",
      "interface": "cleanup.SubmitSuspendedGCJob",
      "code_paths": [
        "pkg/cleanup/gc_job_submit.go",
        "pkg/cleanup/gc_job.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/gc_job_submit_test.go",
          "selector": "TestGCSubmissionPersistsBeforeCreateAndReconcilesLostResponse"
        },
        {
          "path": "pkg/cleanup/gc_job_submit_test.go",
          "selector": "TestGCSubmissionRejectsUnsafeRetrySettings"
        },
        {
          "path": "pkg/cleanup/gc_job_submit_test.go",
          "selector": "TestGCSubmissionDefaultingAndMutation"
        },
        {
          "path": "pkg/cleanup/gc_job_submit_test.go",
          "selector": "TestGCSubmissionCanceledAndDryRunFailureLeaveNoIntent"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-job-template",
      "title": "Derive GC Job from verified Registry storage and credential references",
      "title_zh": "Derive GC Job from verified Registry storage and credential references",
      "interface_type": "workflow",
      "interface": "kubeidentity.BuildRegistryGCJob",
      "code_paths": [
        "pkg/cleanup/kubeidentity/gc_job_template.go",
        "api/controller/cleanup_gc_launch.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
          "selector": "TestGCJobTemplateUsesObservedStorageAndMountedCredentials"
        },
        {
          "path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
          "selector": "TestGCJobTemplateRejectsUnsafeSource"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.gc-reject-legacy-cleaner",
      "title": "Reject GC while legacy automatic cleanup is enabled",
      "title_zh": "Reject GC while legacy automatic cleanup is enabled",
      "interface_type": "workflow",
      "interface": "BuildRegistryGCJob",
      "code_paths": [
        "pkg/cleanup/kubeidentity/legacy_cleanup.go",
        "pkg/cleanup/kubeidentity/gc_job_template.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
          "selector": "TestGCJobRejectsLegacyAutomaticCleanup"
        },
        {
          "path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
          "selector": "TestGCSourceTracksCleanerProcessButNotStatusHeartbeat"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.generic-activation-fence",
      "title": "Reject generic activation of retired version records",
      "title_zh": "Reject generic activation of retired version records",
      "interface_type": "workflow",
      "interface": "cleanup.TrackServiceActivation",
      "code_paths": [
        "pkg/cleanup/activation.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/store_test.go",
          "selector": "TestActivationCannotRestoreRetiredTargetThroughGenericSave"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.helm-native-mutation-admission",
      "title": "Coordinate native Helm mutations and track actual Kubernetes write outcomes",
      "title_zh": "Coordinate native Helm mutations and track actual Kubernetes write outcomes",
      "interface_type": "workflow",
      "interface": "helm.runCoordinatedMutation",
      "code_paths": [
        "pkg/helm/cleanup_mutation.go",
        "pkg/helm/cleanup_transport.go",
        "pkg/helm/helm.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/cleanup_mutation_test.go",
          "selector": "TestHelmMutationRequiresDurableProducerAdmission"
        },
        {
          "path": "pkg/helm/cleanup_transport_test.go",
          "selector": "TestHelmTracksActualReleaseStorageWrites"
        },
        {
          "path": "pkg/helm/cleanup_transport_test.go",
          "selector": "TestHelmTransportKeepsUncertainWritesAndRejectsUnguardedWrites"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.helm-release-identity",
      "title": "Keep bounded Helm release identity private to reference correlation",
      "title_zh": "Keep bounded Helm release identity private to reference correlation",
      "interface_type": "workflow",
      "interface": "cleanup.InspectHelmReleaseReferences",
      "code_paths": [
        "pkg/cleanup/helm_references.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/helm_release_identity_test.go",
          "selector": "TestHelmReleaseIdentityDoesNotExposeChartConfiguration"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.helm-release-values-proof",
      "title": "Match desired Helm overrides to actual release config digests",
      "title_zh": "Match desired Helm overrides to actual release config digests",
      "interface_type": "workflow",
      "interface": "cleanup.HelmReleaseMatchesOverrides",
      "code_paths": [
        "pkg/cleanup/helm_value_evidence.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/helm_release_identity_test.go",
          "selector": "TestHelmReleaseOverridesRequireActualConfig"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.helm-retained-reference-inventory",
      "title": "Protect retained Helm manifests and hooks without exposing Secret contents",
      "title_zh": "Protect retained Helm manifests and hooks without exposing Secret contents",
      "interface_type": "workflow",
      "interface": "cleanup.InspectHelmReleaseReferences",
      "code_paths": [
        "pkg/cleanup/helm_references.go",
        "pkg/cleanup/kubeidentity/helm_references.go",
        "api/controller/cleanup_coordination.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/helm_references_test.go",
          "selector": "TestHelmRetainedManifestAndHooksProvideReferencesOnly"
        },
        {
          "path": "pkg/cleanup/helm_references_test.go",
          "selector": "TestHelmCorruptForeignAndUnknownReleasesAreNotEmptySuccess"
        },
        {
          "path": "pkg/cleanup/helm_references_test.go",
          "selector": "TestHelmReferenceDecompressionIsBounded"
        },
        {
          "path": "pkg/cleanup/kubeidentity/helm_references_test.go",
          "selector": "TestHelmInventoryReadsOnlyReleaseDataIncludingUnlabelledHistory"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.helmapp-mutation-admission",
      "title": "Protect HelmApp create update and install intents during cleanup",
      "title_zh": "Protect HelmApp create update and install intents during cleanup",
      "interface_type": "workflow",
      "interface": "ApplicationAction.CreateApp",
      "code_paths": [
        "api/handler/application_handler.go"
      ],
      "tests": [
        {
          "path": "api/handler/cleanup_helmapp_test.go",
          "selector": "TestHelmAppMutationsHoldCleanupAdmission"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.import_reference_handoff",
      "title": "Atomically hand import references to successful versions",
      "title_zh": "Atomically hand import references to successful versions",
      "interface_type": "workflow",
      "interface": "TransferImportedReferencesToVersions",
      "code_paths": [
        "pkg/cleanup/reference_handoff.go",
        "pkg/cleanup/reference_import.go",
        "db/mysql/dao/version.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/reference_handoff_test.go",
          "selector": "TestImportHandoffWaitsForEverySuccessfulVersionAndRollsBack"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.managed-cache-binding",
      "title": "Bind managed cache enrollment to observed system storage",
      "title_zh": "Bind managed cache enrollment to observed system storage",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/managed-cache/prepare",
      "code_paths": [
        "pkg/cleanup/kubeidentity/managed_cache.go",
        "pkg/cleanup/registration.go",
        "api/controller/cleanup_coordination.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/managed_cache_test.go",
          "selector": "TestManagedCachePreparationUsesActualNodeAndVolume"
        },
        {
          "path": "api/controller/cleanup_coordination_test.go",
          "selector": "TestManagedCachePreparationDerivesIdentityAndNeverPromotesReady"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.managed-package-binding",
      "title": "Managed package roots bind to observed grdata storage",
      "title_zh": "Managed package roots bind to observed grdata storage",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectManagedPackageSource",
      "code_paths": [
        "pkg/cleanup/kubeidentity/managed_packages.go",
        "pkg/cleanup/registration.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/managed_cache_test.go",
          "selector": "TestManagedPackagePreparationUsesActualGrdataVolume"
        },
        {
          "path": "pkg/cleanup/registration_test.go",
          "selector": "TestManagedPackageRegistrationsAreFixedDistinctAndNeverReady"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.manual-gc-maintenance",
      "title": "Drain writes and require confirmed restoration around manual GC",
      "title_zh": "Drain writes and require confirmed restoration around manual GC",
      "interface_type": "workflow",
      "interface": "pkg/cleanup.RequestMaintenance",
      "code_paths": [
        "pkg/cleanup/maintenance.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/maintenance_test.go",
          "selector": "TestMaintenanceDrainsWritersAndRestoresOnlyAfterConfirmation"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.market-slug-task-completion",
      "title": "Market slug task waits for completion before returning",
      "title_zh": "Market slug task waits for completion before returning",
      "interface_type": "workflow",
      "interface": "exectorManager.buildFromMarketSlug",
      "code_paths": [
        "builder/exector/exector.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_task_boundary_test.go",
          "selector": "TestMarketSlugTaskWaitsForCompletion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.native-image-build-admission",
      "title": "Image builds hold durable cleanup admission through completion",
      "title_zh": "Image builds hold durable cleanup admission through completion",
      "interface_type": "workflow",
      "interface": "exectorManager.buildFromImage",
      "code_paths": [
        "builder/exector/cleanup_image_admission.go",
        "builder/exector/exector.go",
        "pkg/cleanup/reference_mutation.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_image_admission_test.go",
          "selector": "TestImageBuildAdmissionBlocksGCAndNeverReplays"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.native-queue-reservation",
      "title": "Persist native builder task identity before queue delivery",
      "title_zh": "Persist native builder task identity before queue delivery",
      "interface_type": "workflow",
      "interface": "mqClient.SendBuilderTopic",
      "code_paths": [
        "mq/client/client.go",
        "pkg/cleanup/queued_task_kind.go"
      ],
      "tests": [
        {
          "path": "mq/client/cleanup_queue_test.go",
          "selector": "TestNativeMQTaskReservesStableIdentityBeforeNetwork"
        },
        {
          "path": "mq/client/cleanup_queue_test.go",
          "selector": "TestNonNativeMQMessagesKeepExistingDelivery"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.native-service-mesh-references",
      "title": "Classify only native ServiceMesh reference schemas",
      "title_zh": "Classify only native ServiceMesh reference schemas",
      "interface_type": "workflow",
      "interface": "cleanup.inspectWorkloadObject",
      "code_paths": [
        "pkg/cleanup/reference_workloads.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/reference_service_mesh_test.go",
          "selector": "TestSavedServiceMeshRequiresKnownNativeProvider"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-cancel-before-grant",
      "title": "Cancel only node operations without a native grant",
      "title_zh": "Cancel only node operations without a native grant",
      "interface_type": "workflow",
      "interface": "cleanup.CancelNodeBeforeGrant",
      "code_paths": [
        "pkg/cleanup/node_cancel.go",
        "api/controller/cleanup_node_launch.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_cancel_test.go",
          "selector": "TestNodeCancellationCannotOverrideNativeAdmission"
        },
        {
          "path": "api/controller/cleanup_node_launch_test.go",
          "selector": "TestNodeLaunchAPIRechecksSourceBeforeStarting"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-candidate-readiness",
      "title": "Require idle coordinated storage before showing cache candidates",
      "title_zh": "Require idle coordinated storage before showing cache candidates",
      "interface_type": "workflow",
      "interface": "cleanup.InspectManagedCacheReadiness",
      "code_paths": [
        "pkg/cleanup/node_readiness.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_readiness_test.go",
          "selector": "TestNodeReadinessDoesNotIgnoreActiveOperations"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-executor-admission",
      "title": "Admit exactly one observed node executor and verify its termination",
      "title_zh": "Admit exactly one observed node executor and verify its termination",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/node/enter-job",
      "code_paths": [
        "pkg/cleanup/node_execution.go",
        "pkg/cleanup/kubeidentity/node_executor.go",
        "api/controller/cleanup_node_executor.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_execution_test.go",
          "selector": "TestNodeExecutorAdmissionIsBoundAndSingleUse"
        },
        {
          "path": "pkg/cleanup/kubeidentity/node_executor_test.go",
          "selector": "TestNodeExecutorRequiresOriginalRuntimeNodeAndMount"
        },
        {
          "path": "api/controller/cleanup_node_executor_test.go",
          "selector": "TestNodeAdmissionAPIUsesKubernetesFactsAndGrantsOnce"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-inventory-api",
      "title": "Authenticated manual inventory preserves deletion protection",
      "title_zh": "Authenticated manual inventory preserves deletion protection",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/managed-cache/inventory",
      "code_paths": [
        "api/controller/cleanup_node_inventory.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_node_inventory_test.go",
          "selector": "TestInventoryAPIStartsReadOnlyJobWithoutDeletionReadiness"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-inventory-report",
      "title": "Return inventory only from the original verified successful pod",
      "title_zh": "Return inventory only from the original verified successful pod",
      "interface_type": "workflow",
      "interface": "kubeidentity.ReadNodeInventoryReport",
      "code_paths": [
        "pkg/cleanup/kubeidentity/node_inventory_report.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/node_inventory_report_test.go",
          "selector": "TestInventoryReportRequiresOriginalSuccessfulPod"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-inventory-submission",
      "title": "Retry manual inventory without duplicating an existing job",
      "title_zh": "Retry manual inventory without duplicating an existing job",
      "interface_type": "workflow",
      "interface": "cleanup.RunNodeInventoryJob",
      "code_paths": [
        "pkg/cleanup/node_inventory_submit.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_inventory_submit_test.go",
          "selector": "TestInventoryRequestReusesJobAfterLostCreate"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-inventory-template",
      "title": "Read-only cache inventory binds observed storage",
      "title_zh": "Read-only cache inventory binds observed storage",
      "interface_type": "workflow",
      "interface": "kubeidentity.BuildManagedCacheInventoryJob",
      "code_paths": [
        "pkg/cleanup/kubeidentity/node_inventory_template.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/node_inventory_template_test.go",
          "selector": "TestCacheInventoryTemplateUsesObservedReadOnlyStorage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-job-intent",
      "title": "Persist immutable node execution identity before job creation",
      "title_zh": "Persist immutable node execution identity before job creation",
      "interface_type": "workflow",
      "interface": "PrepareNodeJob",
      "code_paths": [
        "pkg/cleanup/node_job.go",
        "pkg/cleanup/coordination.go",
        "pkg/cleanup/deletion_attempt.go",
        "db/model/cleanup_coordination.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_job_test.go",
          "selector": "TestNodeJobIntentIsImmutableAndDoesNotGrantRecreation"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-job-launch-api",
      "title": "Launch only the original verified node cleanup job",
      "title_zh": "Launch only the original verified node cleanup job",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/node/submit-job",
      "code_paths": [
        "api/controller/cleanup_node_launch.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_node_launch_test.go",
          "selector": "TestNodeLaunchAPIRechecksSourceBeforeStarting"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-job-start",
      "title": "Start only the original protected node cleanup Job",
      "title_zh": "Start only the original protected node cleanup Job",
      "interface_type": "workflow",
      "interface": "StartNodeJob",
      "code_paths": [
        "pkg/cleanup/node_job_start.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_job_start_test.go",
          "selector": "TestNodeJobStartChecksProtectionAndReconcilesLostReply"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-job-submission",
      "title": "Submit one suspended node cleanup Job and reconcile original identity",
      "title_zh": "Submit one suspended node cleanup Job and reconcile original identity",
      "interface_type": "workflow",
      "interface": "SubmitSuspendedNodeJob",
      "code_paths": [
        "pkg/cleanup/node_job_submit.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_job_submit_test.go",
          "selector": "TestNodeSubmissionReconcilesLostCreateWithoutRecreating"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-job-template",
      "title": "Bind node cleanup jobs to observed cache and persistent state",
      "title_zh": "Bind node cleanup jobs to observed cache and persistent state",
      "interface_type": "workflow",
      "interface": "kubeidentity.BuildManagedNodeJob",
      "code_paths": [
        "pkg/cleanup/kubeidentity/node_job_template.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/node_job_template_test.go",
          "selector": "TestNodeJobTemplateBindsCacheAndDurableState"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-journal-identity",
      "title": "Bind original node execution journal to PVC and PV identities",
      "title_zh": "Bind original node execution journal to PVC and PV identities",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectNodeJournalVolume",
      "code_paths": [
        "pkg/cleanup/kubeidentity/node_journal.go",
        "pkg/cleanup/kubeidentity/node_job_template.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/node_job_template_test.go",
          "selector": "TestNodeJobTemplateBindsCacheAndDurableState"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-recovery-api",
      "title": "Recover original node receipt after verified executor exit",
      "title_zh": "Recover original node receipt after verified executor exit",
      "interface_type": "view_endpoint",
      "interface": "POST node/recover",
      "code_paths": [
        "api/controller/cleanup_node_recovery.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_node_executor_test.go",
          "selector": "TestNodeAdmissionAPIUsesKubernetesFactsAndGrantsOnce"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-recovery-binding",
      "title": "Persist recovery intent without changing original native authority",
      "title_zh": "Persist recovery intent without changing original native authority",
      "interface_type": "workflow",
      "interface": "cleanup.PrepareNodeRecovery",
      "code_paths": [
        "pkg/cleanup/node_recovery.go",
        "pkg/cleanup/node_job.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_recovery_test.go",
          "selector": "TestNodeRecoveryIntentIsDurableAndCannotReplaceOriginal"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-recovery-submission",
      "title": "Reconcile original recovery Job after lost create response",
      "title_zh": "Reconcile original recovery Job after lost create response",
      "interface_type": "workflow",
      "interface": "cleanup.SubmitSuspendedNodeRecovery",
      "code_paths": [
        "pkg/cleanup/node_recovery_submit.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_recovery_test.go",
          "selector": "TestRecoverySubmissionNeverRecreatesAfterLostResponse"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-recovery-template",
      "title": "Build receipt recovery without cache access after verified executor exit",
      "title_zh": "Build receipt recovery without cache access after verified executor exit",
      "interface_type": "workflow",
      "interface": "kubeidentity.BuildNodeRecoveryJob",
      "code_paths": [
        "pkg/cleanup/kubeidentity/node_recovery_template.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/node_recovery_template_test.go",
          "selector": "TestNodeRecoveryRequiresOriginalExitAndOmitsCacheVolume"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.node-result-finalization",
      "title": "Finalize known original node results only after verified executor exit",
      "title_zh": "Finalize known original node results only after verified executor exit",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/node/finish",
      "code_paths": [
        "pkg/cleanup/node_result.go",
        "api/controller/cleanup_node_executor.go",
        "pkg/cleanup/node_executor_client.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/node_result_test.go",
          "selector": "TestNodeResultIsImmutableAndRequiresExitedOriginalExecutor"
        },
        {
          "path": "pkg/cleanup/node_result_test.go",
          "selector": "TestNodeResultRejectsInvalidFilesystemEvidence"
        },
        {
          "path": "api/controller/cleanup_node_executor_test.go",
          "selector": "TestNodeAdmissionAPIUsesKubernetesFactsAndGrantsOnce"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.package-check-before-enqueue",
      "title": "Reserve package source checks before sending MQ messages",
      "title_zh": "Reserve package source checks before sending MQ messages",
      "interface_type": "handler_method",
      "interface": "ServiceAction.ServiceCheck",
      "code_paths": [
        "api/handler/service_check.go",
        "pkg/cleanup/queued_tar.go"
      ],
      "tests": [
        {
          "path": "api/handler/cleanup_queued_tar_test.go",
          "selector": "TestServiceCheckReservesOnlyUploadedPackageSources"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.package-check-queue-classification",
      "title": "Classify native package checks consistently before enqueue and execution",
      "title_zh": "Classify native package checks consistently before enqueue and execution",
      "interface_type": "workflow",
      "interface": "PackageCheckIdentity",
      "code_paths": [
        "pkg/cleanup/queued_check.go",
        "builder/exector/service_check.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/queued_check_test.go",
          "selector": "TestPackageChecksUseSharedQueueClassification"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.package-inventory-mount",
      "title": "Observe and bind read-only package inventory subtree independently of cache deletion",
      "title_zh": "Observe and bind read-only package inventory subtree independently of cache deletion",
      "interface_type": "workflow",
      "interface": "BuildManagedCacheInventoryJob",
      "code_paths": [
        "pkg/cleanup/kubeidentity/package_inventory_template.go",
        "pkg/cleanup/kubeidentity/node_inventory_template.go",
        "pkg/cleanup/kubeidentity/node_inventory_report.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/package_inventory_template_test.go",
          "selector": "TestPackageInventoryUsesObservedReadOnlySubtree"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.package-upload-exclusive-close",
      "title": "Drain concurrent upload parts before terminal mutation and preserve uncertain requests",
      "title_zh": "Drain concurrent upload parts before terminal mutation and preserve uncertain requests",
      "interface_type": "workflow",
      "interface": "AcquirePackageUploadRequest",
      "code_paths": [
        "pkg/cleanup/package_upload_use.go",
        "db/model/package_upload_use.go",
        "db/mysql/mysql.go",
        "api/controller/cleanup_upload_use.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/package_upload_use_test.go",
          "selector": "TestPackageUploadCloseDrainsPartsAndRetainsUnknownAcrossRestart"
        },
        {
          "path": "pkg/cleanup/package_upload_use_test.go",
          "selector": "TestPackageUploadAdmissionChecksFreshSessionAndOriginalRequest"
        },
        {
          "path": "api/controller/cleanup_upload_use_test.go",
          "selector": "TestNativeUploadCancelCannotOverlapAnActivePart"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.package-writer-coverage",
      "title": "Managed package coverage rejects active builds",
      "title_zh": "Managed package coverage rejects active builds",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectManagedPackageWriterCoverage",
      "code_paths": [
        "pkg/cleanup/kubeidentity/package_coverage.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/package_coverage_test.go",
          "selector": "TestManagedPackageCoverageRejectsBuildsAndChangingRollout"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.package-writer-readiness",
      "title": "Managed package deletion requires current coordinated writers",
      "title_zh": "Managed package deletion requires current coordinated writers",
      "interface_type": "workflow",
      "interface": "cleanup.CertifyManagedPackageWriters",
      "code_paths": [
        "pkg/cleanup/package_certification.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/package_certification_test.go",
          "selector": "TestManagedPackageReadinessRequiresCurrentWritersAndNoUnfinishedUse"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.participant-replacement",
      "title": "Participant replacement preserves active deletion protection",
      "title_zh": "Participant replacement preserves active deletion protection",
      "interface_type": "workflow",
      "interface": "cleanup.RegisterParticipant",
      "code_paths": [
        "pkg/cleanup/participant.go",
        "pkg/cleanup/deletion_attempt.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/participant_test.go",
          "selector": "TestParticipantReplacementWithdrawsReadinessWithoutLosingDeletion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.pending-import-references",
      "title": "Include retained tar import and check receipts in reference audits",
      "title_zh": "Include retained tar import and check receipts in reference audits",
      "interface_type": "workflow",
      "interface": "cleanup.collectRegionReferenceImages",
      "code_paths": [
        "pkg/cleanup/reference_import.go",
        "pkg/cleanup/reference_audit.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/reference_import_test.go",
          "selector": "TestImportedImagesRemainReferencedUntilTheirRecordsAreReleased"
        },
        {
          "path": "pkg/cleanup/reference_import_test.go",
          "selector": "TestIncompleteImportRecordsCannotProveAbsence"
        },
        {
          "path": "pkg/cleanup/reference_import_test.go",
          "selector": "TestRejectedAndNonImageChecksDoNotInventReferences"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.platform-future-helper-references",
      "title": "Protect default and configured builder and worker helper images",
      "title_zh": "Protect default and configured builder and worker helper images",
      "interface_type": "workflow",
      "interface": "kubeidentity.ReadPlatformHelperReferences",
      "code_paths": [
        "pkg/cleanup/kubeidentity/platform_helper_references.go",
        "pkg/cleanup/kubeidentity/helper_references.go",
        "util/constants/helper_images.go",
        "builder/build/cnb/config.go",
        "builder/exector/build_from_vm.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/platform_helper_references_test.go",
          "selector": "TestPlatformDefaultsRemainReferencedWithoutActiveBuilds"
        },
        {
          "path": "pkg/cleanup/kubeidentity/platform_helper_references_test.go",
          "selector": "TestPlatformHelperOverridesNeverExposeOtherEnvironmentValues"
        },
        {
          "path": "pkg/cleanup/kubeidentity/platform_helper_references_test.go",
          "selector": "TestBuilderDaemonSetRollbackHelperReferences"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.platform-resource-admission",
      "title": "Protect namespace and cluster resource mutations from concurrent cleanup",
      "title_zh": "Protect namespace and cluster resource mutations from concurrent cleanup",
      "interface_type": "workflow",
      "interface": "NsResourceHandler.CreateNsResource",
      "code_paths": [
        "api/handler/ns_resource.go",
        "api/handler/cluster_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/cleanup_namespace_admission_test.go",
          "selector": "TestNamespaceMutationsCannotBypassCleanupAdmission"
        },
        {
          "path": "api/handler/cleanup_namespace_admission_test.go",
          "selector": "TestClusterMutationsCannotBypassCleanupAdmission"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.plugin-version-reference-coordination",
      "title": "Plugin version writes respect selected deletion and cannot resurrect records",
      "title_zh": "Plugin version writes respect selected deletion and cannot resurrect records",
      "interface_type": "workflow",
      "interface": "PluginBuildVersionDaoImpl",
      "code_paths": [
        "db/mysql/dao/plugin_cleanup.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/version_cleanup_test.go",
          "selector": "TestPluginVersionWritesRespectDeletionAndNeverResurrect"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.queued-producer-handoff",
      "title": "Protect queued producer lifetime and atomically claim once",
      "title_zh": "Protect queued producer lifetime and atomically claim once",
      "interface_type": "workflow",
      "interface": "QueueOperation",
      "code_paths": [
        "pkg/cleanup/queued_operation.go",
        "pkg/cleanup/coordination.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/queued_operation_test.go",
          "selector": "TestQueuedProducerProtectsWaitingWorkAndClaimsExactlyOnce"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.queued-tar-consumer",
      "title": "Claim original queued tar reservation before native execution",
      "title_zh": "Claim original queued tar reservation before native execution",
      "interface_type": "workflow",
      "interface": "admitBuild",
      "code_paths": [
        "builder/exector/cleanup_image_admission.go",
        "pkg/cleanup/queued_tar.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_image_admission_test.go",
          "selector": "TestTarConsumerClaimsOriginalQueueReservation"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.reference-writer-controller-coverage",
      "title": "Require complete stable platform writer controller coverage",
      "title_zh": "Require complete stable platform writer controller coverage",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectReferenceWriterCoverage",
      "code_paths": [
        "pkg/cleanup/kubeidentity/reference_writer_coverage.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/reference_writer_coverage_test.go",
          "selector": "TestReferenceWriterCoverageRejectsIncompleteRollout"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.reference-writer-runtime-evidence",
      "title": "Bind reference-writer protocol evidence to immutable running containers",
      "title_zh": "Bind reference-writer protocol evidence to immutable running containers",
      "interface_type": "workflow",
      "interface": "cleanup.RegisterReferenceWriter",
      "code_paths": [
        "db/model/cleanup_reference_writer.go",
        "pkg/cleanup/reference_writer.go",
        "pkg/cleanup/kubeidentity/reference_writer.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/reference_writer_test.go",
          "selector": "TestReferenceWriterEvidenceIsIndependentAndImmutable"
        },
        {
          "path": "pkg/cleanup/kubeidentity/reference_writer_test.go",
          "selector": "TestReferenceWriterIdentityUsesActualRuntime"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.reference-writer-startup",
      "title": "Register reference writer runtime evidence at service startup",
      "title_zh": "Register reference writer runtime evidence at service startup",
      "interface_type": "workflow",
      "interface": "kubeidentity.RegisterReferenceWriterStartup",
      "code_paths": [
        "pkg/cleanup/kubeidentity/reference_writer_startup.go",
        "pkg/component/reference_writer.go",
        "cmd/api/main.go",
        "cmd/worker/worker.go",
        "cmd/builder/builder.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/reference_writer_startup_test.go",
          "selector": "TestReferenceWriterStartupWaitsForOwnRuntimeOnly"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registered-storage-discovery",
      "title": "Storage discovery rejects incomplete enrollment",
      "title_zh": "Storage discovery rejects incomplete enrollment",
      "interface_type": "workflow",
      "interface": "cleanup.DiscoverStores",
      "code_paths": [
        "pkg/cleanup/discovery.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/discovery_test.go",
          "selector": "TestDiscoverStoresRejectsIncompleteRegistration"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-audit-writer-coverage",
      "title": "Require current registered platform writers in execution reference audit",
      "title_zh": "Require current registered platform writers in execution reference audit",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/registry-references",
      "code_paths": [
        "api/controller/cleanup_coordination.go",
        "api/controller/cleanup_reference_writers.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_coordination_test.go",
          "selector": "TestRegistryReferenceAuditUsesBoundAuthenticatedOperation"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-certification",
      "title": "Derive registry readiness from runtime evidence and quiescence",
      "title_zh": "Derive registry readiness from runtime evidence and quiescence",
      "interface_type": "workflow",
      "interface": "cleanup.CertifyRegistry",
      "code_paths": [
        "pkg/cleanup/registry_certification.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/registry_certification_test.go",
          "selector": "TestRegistryCertificationRequiresCompleteEvidence"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-delete-permit",
      "title": "Bind registry deletion permits to immutable targets and expiry",
      "title_zh": "Bind registry deletion permits to immutable targets and expiry",
      "interface_type": "workflow",
      "interface": "pkg/cleanup.VerifyRegistryDeletionPermit",
      "code_paths": [
        "pkg/cleanup/deletion_permit.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/deletion_permit_test.go",
          "selector": "TestRegistryDeletionPermitBindsOriginalTargetAndExpiry"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-gc-executor",
      "title": "Execute native Registry GC once against a verified storage descriptor",
      "title_zh": "Execute native Registry GC once against a verified storage descriptor",
      "interface_type": "workflow",
      "interface": "registryproxy.ExecuteGC",
      "code_paths": [
        "pkg/cleanup/registryproxy/gc_executor.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/registryproxy/gc_executor_test.go",
          "selector": "TestGCExecutorDoesNotStartWithoutAdmission"
        },
        {
          "path": "api/controller/cleanup_registryproxy_test.go",
          "selector": "TestCoordinatedRegistryExecutorRealDeletionAndGC"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-identity-provision",
      "title": "Provision independent platform registry identities without overwrites",
      "title_zh": "Provision independent platform registry identities without overwrites",
      "interface_type": "workflow",
      "interface": "provision_identity.provision",
      "code_paths": [
        "hack/contrib/docker/registry-gc/provision_identity.py"
      ],
      "tests": [
        {
          "path": "hack/contrib/docker/registry-gc/provision_identity_test.py"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-ingress-isolation",
      "title": "Reject registry routes that bypass the coordinator",
      "title_zh": "Reject registry routes that bypass the coordinator",
      "interface_type": "workflow",
      "interface": "pkg/cleanup/kubeidentity.InspectRegistryIngress",
      "code_paths": [
        "pkg/cleanup/kubeidentity/registry_ingress.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/registry_ingress_test.go",
          "selector": "TestRegistryIngressRequiresExclusiveCoordinatedRoute"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-kubernetes-binding",
      "title": "Verify actual registry Pod and backing volume identity",
      "title_zh": "Verify actual registry Pod and backing volume identity",
      "interface_type": "workflow",
      "interface": "pkg/cleanup/kubeidentity.InspectRegistryMount",
      "code_paths": [
        "pkg/cleanup/kubeidentity/registry_mount.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/registry_mount_test.go",
          "selector": "TestRegistryMountBindingUsesRealVolumeAndPodIdentity"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-participant-coverage",
      "title": "Verify every selected registry ingress against its runtime enrollment",
      "title_zh": "Verify every selected registry ingress against its runtime enrollment",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectRegistryParticipantCoverage",
      "code_paths": [
        "pkg/cleanup/kubeidentity/registry_participant_coverage.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/registry_participant_test.go",
          "selector": "TestParticipantIdentityComesFromCurrentContainerStatus"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-permit-fresh-coverage",
      "title": "Revalidate current registry coverage before deletion permits",
      "title_zh": "Revalidate current registry coverage before deletion permits",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/stores/{storage_id}/operations/{operation_id}/registry-permit",
      "code_paths": [
        "api/controller/cleanup_coordination.go",
        "api/controller/cleanup_registry_readiness.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_registry_readiness_test.go",
          "selector": "TestRegistryPermitRevalidatesCurrentCoverage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-permit-key-separation",
      "title": "Separate registry permit signing from control authentication",
      "title_zh": "Separate registry permit signing from control authentication",
      "interface_type": "workflow",
      "interface": "controller.systemRegistryPermitKey",
      "code_paths": [
        "api/controller/cleanup_permit_key.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_permit_key_test.go",
          "selector": "TestRegistryPermitKeyUsesDedicatedFileAndNeverFallsBackOnFailure"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-preparation",
      "title": "Derive registry identity from controlled inspection without granting cleanup",
      "title_zh": "Derive registry identity from controlled inspection without granting cleanup",
      "interface_type": "view_endpoint",
      "interface": "/v2/cleanup/registry/prepare",
      "code_paths": [
        "api/controller/cleanup_coordination.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_coordination_test.go",
          "selector": "TestRegistryPreparationDerivesIdentityAndNeverPromotesReady"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-reference-bootstrap",
      "title": "Read collecting registry references without granting deletion",
      "title_zh": "Read collecting registry references without granting deletion",
      "interface_type": "workflow",
      "interface": "cleanup.ReadRegionReferenceInventory",
      "code_paths": [
        "pkg/cleanup/reference_audit.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/reference_audit_test.go",
          "selector": "TestReferenceInventoryBootstrapsWithoutGrantingDeletion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-request-scope",
      "title": "Reject ambiguous Registry paths and direct blob deletion",
      "title_zh": "Reject ambiguous Registry paths and direct blob deletion",
      "interface_type": "workflow",
      "interface": "pkg/cleanup/registryproxy.ClassifyRequest",
      "code_paths": [
        "pkg/cleanup/registryproxy/request.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/registryproxy/request_test.go",
          "selector": "TestRegistryProxyRejectsAmbiguousPathsAndUnselectedDeletion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-service-coverage",
      "title": "Check every registry service instance without accepting partial coverage",
      "title_zh": "Check every registry service instance without accepting partial coverage",
      "interface_type": "workflow",
      "interface": "pkg/cleanup/kubeidentity.InspectRegistryService",
      "code_paths": [
        "pkg/cleanup/kubeidentity/registry_service.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/registry_service_test.go",
          "selector": "TestRegistryServiceRejectsMixedAndEmptyDeployments"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-service-stable-membership",
      "title": "Reject registry membership changes during ingress inspection",
      "title_zh": "Reject registry membership changes during ingress inspection",
      "interface_type": "workflow",
      "interface": "kubeidentity.InspectRegistryService",
      "code_paths": [
        "pkg/cleanup/kubeidentity/registry_service.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/registry_service_test.go",
          "selector": "TestRegistryServiceRejectsMembershipChangeDuringInspection"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-stream-admission",
      "title": "Require admission before forwarding mutations without credential leakage",
      "title_zh": "Require admission before forwarding mutations without credential leakage",
      "interface_type": "workflow",
      "interface": "pkg/cleanup/registryproxy.Proxy.ServeHTTP",
      "code_paths": [
        "pkg/cleanup/registryproxy/proxy.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/registryproxy/proxy_test.go",
          "selector": "TestProxyAcquiresBeforeForwardingAndPreservesRegistryAuth"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.registry-upload-lifecycle",
      "title": "Keep upload leases across parts and drain existing sessions safely",
      "title_zh": "Keep upload leases across parts and drain existing sessions safely",
      "interface_type": "workflow",
      "interface": "pkg/cleanup.AcquireUploadRequest",
      "code_paths": [
        "pkg/cleanup/upload_coordination.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/upload_coordination_test.go",
          "selector": "TestUploadSessionRemainsProtectedBetweenParts"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.restore-producer-transaction",
      "title": "Keep restore metadata and result publication in admitted transactions",
      "title_zh": "Keep restore metadata and result publication in admitted transactions",
      "interface_type": "workflow",
      "interface": "BackupAPPRestore.withMetadataWrite",
      "code_paths": [
        "builder/exector/groupapp_restore.go",
        "builder/exector/exector.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_restore_admission_test.go",
          "selector": "TestRestoreMetadataRetainsAdmissionAndRollsBackFailure"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.saved-workload-reference-coordination",
      "title": "Serialize saved workload reference writes with cleanup admission",
      "title_zh": "Serialize saved workload reference writes with cleanup admission",
      "interface_type": "workflow",
      "interface": "K8sResourceDaoImpl",
      "code_paths": [
        "db/mysql/dao/k8s_resource.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/k8s_resource_cleanup_test.go",
          "selector": "TestSavedWorkloadWritesRespectCleanupAdmission"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.service-mesh-mutation-admission",
      "title": "Protect ServiceMesh mutations until reference persistence is confirmed",
      "title_zh": "Protect ServiceMesh mutations until reference persistence is confirmed",
      "interface_type": "workflow",
      "interface": "ApplicationAction.CreateServiceMeshCR",
      "code_paths": [
        "api/handler/application_handler.go"
      ],
      "tests": [
        {
          "path": "api/handler/cleanup_service_mesh_test.go",
          "selector": "TestServiceMeshMutationsHoldCleanupAdmission"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.service_check_import_handoff",
      "title": "Preserve imported image references across component creation",
      "title_zh": "Preserve imported image references across component creation",
      "interface_type": "workflow",
      "interface": "CleanServiceCheckData",
      "code_paths": [
        "api/handler/etcd_handler.go",
        "api/controller/resources.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_check_cleanup_test.go",
          "selector": "TestServiceCheckCreationCleanupPreservesImportReferences"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.share-task-completion",
      "title": "Slug sharing remains active until result persistence finishes",
      "title_zh": "Slug sharing remains active until result persistence finishes",
      "interface_type": "workflow",
      "interface": "exectorManager.slugShare",
      "code_paths": [
        "builder/exector/exector.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_task_boundary_test.go",
          "selector": "TestSlugShareTaskWaitsForResultPersistence"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.signed-gc-job-template",
      "title": "Project GC identity without exposing permit signing authority",
      "title_zh": "Project GC identity without exposing permit signing authority",
      "interface_type": "package_function",
      "interface": "kubeidentity.BuildRegistryGCJob",
      "code_paths": [
        "pkg/cleanup/kubeidentity/gc_job_template.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/kubeidentity/gc_job_template_test.go",
          "selector": "TestSignedGCJobCopiesScopeButNeverPermitSigningSecret"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.single-deletion-attempt",
      "title": "Consume deletion permission once and retain verification protection",
      "title_zh": "Consume deletion permission once and retain verification protection",
      "interface_type": "workflow",
      "interface": "pkg/cleanup.BeginDeletionAttempt",
      "code_paths": [
        "pkg/cleanup/deletion_attempt.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/deletion_attempt_test.go",
          "selector": "TestDeletionAttemptIsConsumedOnceAndRemainsProtectedUntilVerified"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.sqlite-activation",
      "title": "Support activation tracking on SQLite",
      "title_zh": "Support activation tracking on SQLite",
      "interface_type": "workflow",
      "interface": "cleanup.TrackServiceActivation",
      "code_paths": [
        "pkg/cleanup/activation.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/activation_sqlite_test.go",
          "selector": "TestTrackServiceActivationSupportsSQLite"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.sqlite-version-store",
      "title": "SQLite version selection inspection and retirement",
      "title_zh": "SQLite version selection inspection and retirement",
      "interface_type": "workflow",
      "interface": "pkg/cleanup.SelectRollbackVersion",
      "code_paths": [
        "pkg/cleanup/store.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/store_sqlite_test.go",
          "selector": "TestVersionStoreSupportsSQLite"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.storage-enrollment",
      "title": "Collect writes during enrollment without granting cleanup",
      "title_zh": "Collect writes during enrollment without granting cleanup",
      "interface_type": "workflow",
      "interface": "pkg/cleanup.RegisterStorage",
      "code_paths": [
        "pkg/cleanup/registration.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/registration_test.go",
          "selector": "TestStorageRegistrationCollectsWritesWithoutEnablingDeletion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.storage-identity",
      "title": "Bind storage identity atomically without replacing prior markers",
      "title_zh": "Bind storage identity atomically without replacing prior markers",
      "interface_type": "workflow",
      "interface": "pkg/cleanup/registryproxy.InitializeStorageIdentity",
      "code_paths": [
        "pkg/cleanup/registryproxy/identity.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/registryproxy/identity_test.go",
          "selector": "TestStorageIdentityIsBoundAndNeverOverwritten"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.tar-admission-before-enqueue",
      "title": "Persist exact tar task reservation before MQ and retain unknown outcome",
      "title_zh": "Persist exact tar task reservation before MQ and retain unknown outcome",
      "interface_type": "handler_method",
      "interface": "TarImageHandle.LoadTarImage",
      "code_paths": [
        "api/handler/tar_image_handler.go"
      ],
      "tests": [
        {
          "path": "api/handler/cleanup_queued_tar_test.go",
          "selector": "TestTarAPIReservesBeforeEnqueueAndRetainsLostAcknowledgement"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.tar-check-event-path",
      "title": "Restrict tar check input to event directory identifiers",
      "title_zh": "Restrict tar check input to event directory identifiers",
      "interface_type": "workflow",
      "interface": "parser.TarImageEventID",
      "code_paths": [
        "builder/parser/tar_event.go",
        "builder/parser/docker_run.go"
      ],
      "tests": [
        {
          "path": "builder/parser/tar_event_test.go",
          "selector": "TestTarImageEventIDRejectsTraversalAndMalformedSources"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.tar-image-admission",
      "title": "Fence tar image import through native work and result persistence",
      "title_zh": "Fence tar image import through native work and result persistence",
      "interface_type": "workflow",
      "interface": "exector.loadTarImage",
      "code_paths": [
        "builder/exector/tar_image_load.go",
        "builder/exector/cleanup_image_admission.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_tar_admission_test.go",
          "selector": "TestTarImportAdmissionCoversWorkAndResultPersistence"
        },
        {
          "path": "builder/exector/cleanup_tar_admission_test.go",
          "selector": "TestTarImportUnknownOutcomeRetainsProtection"
        },
        {
          "path": "builder/exector/cleanup_tar_admission_test.go",
          "selector": "TestTarImportInvalidIdentityStopsBeforeFilesystemOrDatabase"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.tar-image-entry",
      "title": "Reject tar import before native work and preserve original result",
      "title_zh": "Reject tar import before native work and preserve original result",
      "interface_type": "workflow",
      "interface": "exector.loadTarImage",
      "code_paths": [
        "builder/exector/tar_image_load.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_tar_admission_test.go",
          "selector": "TestTarImportEntryReportsMaintenanceWithoutStartingNativeWork"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.tar-image-redelivery",
      "title": "Do not overwrite a running tar import on duplicate delivery",
      "title_zh": "Do not overwrite a running tar import on duplicate delivery",
      "interface_type": "workflow",
      "interface": "exector.loadTarImage",
      "code_paths": [
        "builder/exector/tar_image_load.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_tar_admission_test.go",
          "selector": "TestTarImportRedeliveryDoesNotPublishFailureOverActiveWork"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.tar-service-check-admission",
      "title": "Block tar service check native work during maintenance",
      "title_zh": "Block tar service check native work during maintenance",
      "interface_type": "workflow",
      "interface": "exector.serviceCheck",
      "code_paths": [
        "builder/exector/service_check.go",
        "builder/exector/cleanup_image_admission.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_service_check_test.go",
          "selector": "TestTarServiceCheckCannotPushDuringMaintenance"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.upload-cancel-evidence",
      "title": "Retain upload session evidence when physical cleanup fails",
      "title_zh": "Retain upload session evidence when physical cleanup fails",
      "interface_type": "workflow",
      "interface": "controller.ChunkUploadManager.CancelUpload",
      "code_paths": [
        "api/controller/chunk_upload_manager.go"
      ],
      "tests": [
        {
          "path": "api/controller/chunk_upload_cleanup_test.go",
          "selector": "TestCancelUploadRetainsRecoveryEvidenceOnFailure"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.upload-completion-evidence",
      "title": "Persist upload completion before deleting resumable chunks",
      "title_zh": "Persist upload completion before deleting resumable chunks",
      "interface_type": "workflow",
      "interface": "ChunkUploadManager.CompleteUpload",
      "code_paths": [
        "api/controller/chunk_upload_manager.go"
      ],
      "tests": [
        {
          "path": "api/controller/chunk_upload_completion_test.go",
          "selector": "TestUploadCompletionPreservesEvidenceBeforeChunkDeletion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.upload-delete-api",
      "title": "Gate selected upload chunk deletion on current writers storage identity expiry and scanned session",
      "title_zh": "Gate selected upload chunk deletion on current writers storage identity expiry and scanned session",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/uploads/chunks/delete",
      "code_paths": [
        "api/controller/cleanup_upload_delete.go",
        "api/api_routers/version2/v2Routers.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_upload_delete_test.go",
          "selector": "TestUploadDeleteAPIRequiresWriterStorageRuleAndSelectionEvidence"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.upload-expiration-evidence",
      "title": "Preserve unverified expired upload records without expanding background deletion",
      "title_zh": "Preserve unverified expired upload records without expanding background deletion",
      "interface_type": "workflow",
      "interface": "controller.ChunkUploadManager.cleanExpiredSessions",
      "code_paths": [
        "api/controller/chunk_upload_manager.go"
      ],
      "tests": [
        {
          "path": "api/controller/chunk_upload_cleanup_test.go",
          "selector": "TestExpiredUploadCleanupPreservesRecoveryEvidence"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.upload-inventory-api",
      "title": "Scope manual upload inventory and retain unknown measured sizes",
      "title_zh": "Scope manual upload inventory and retain unknown measured sizes",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/uploads/inventory",
      "code_paths": [
        "api/controller/cleanup_upload_inventory.go",
        "api/api_routers/version2/v2Routers.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_upload_inventory_test.go",
          "selector": "TestUploadInventoryRestrictsEventsAndPreservesUnknownSizes"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.upload-inventory-bounds",
      "title": "Bound upload inventory before physical storage reads",
      "title_zh": "Bound upload inventory before physical storage reads",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cleanup/uploads/inventory",
      "code_paths": [
        "api/controller/cleanup_upload_inventory.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_upload_inventory_test.go",
          "selector": "TestUploadInventoryRejectsOversizedResultBeforeReadingStorage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.upload-retained-references",
      "title": "Protect package events referenced by retained versions and source checks",
      "title_zh": "Protect package events referenced by retained versions and source checks",
      "interface_type": "workflow",
      "interface": "ReadUploadPackageReferences",
      "code_paths": [
        "pkg/cleanup/package_references.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/package_references_test.go",
          "selector": "TestUploadReferencesProtectRetainedVersionsAndSourceChecks"
        },
        {
          "path": "pkg/cleanup/package_references_test.go",
          "selector": "TestUploadReferencePathsAreCanonical"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.upload-use-lifetime",
      "title": "Keep native upload storage work protected through completion and restart",
      "title_zh": "Keep native upload storage work protected through completion and restart",
      "interface_type": "workflow",
      "interface": "ChunkUploadManager native storage lifecycle",
      "code_paths": [
        "api/controller/cleanup_upload_use.go",
        "api/controller/chunk_upload_manager.go"
      ],
      "tests": [
        {
          "path": "api/controller/cleanup_upload_use_test.go",
          "selector": "TestUploadUsePersistsAcrossStorageWorkAndUncertainResults"
        },
        {
          "path": "api/controller/cleanup_upload_use_test.go",
          "selector": "TestUploadMaintenanceStopsNativeChunkWriteCancelAndExpiry"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.upload-writer-coverage",
      "title": "Require current API instances to register upload guard support separately from registry references",
      "title_zh": "Require current API instances to register upload guard support separately from registry references",
      "interface_type": "workflow",
      "interface": "UploadWriterCoverageRegistered",
      "code_paths": [
        "pkg/cleanup/upload_writer.go",
        "pkg/cleanup/reference_writer.go",
        "pkg/cleanup/kubeidentity/reference_writer_startup.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/upload_writer_test.go",
          "selector": "TestUploadDeletionRequiresEveryCurrentAPIWriterProtocol"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.verified-client-identity",
      "title": "Cleanup requires configured token or verified platform client certificate",
      "title_zh": "Cleanup requires configured token or verified platform client certificate",
      "interface_type": "workflow",
      "interface": "api.middleware.CleanupIdentity",
      "code_paths": [
        "api/middleware/cleanup_identity.go"
      ],
      "tests": [
        {
          "path": "api/middleware/cleanup_identity_test.go",
          "selector": "TestCleanupIdentityRequiresVerifiedClientOrConfiguredToken"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.verified-storage-measurement",
      "title": "Measure only the verified registry backing filesystem",
      "title_zh": "Measure only the verified registry backing filesystem",
      "interface_type": "workflow",
      "interface": "registryproxy.MeasureStorage",
      "code_paths": [
        "pkg/cleanup/registryproxy/measurement.go"
      ],
      "tests": [
        {
          "path": "pkg/cleanup/registryproxy/measurement_test.go",
          "selector": "TestMeasurementRequiresBoundStorageAndRejectsSymlinks"
        },
        {
          "path": "cmd/registry-coordinator/main_test.go",
          "selector": "TestMeasurementModeDoesNotInitializeOrNeedCredentials"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.version-activation-fence",
      "title": "Fence upgrade and rollback against version retirement",
      "title_zh": "Fence upgrade and rollback against version retirement",
      "interface_type": "workflow",
      "interface": "OperationHandler.upgrade and ServiceAction.RollBack",
      "code_paths": [
        "api/handler/service.go",
        "api/handler/service_operation.go"
      ],
      "tests": [
        {
          "path": "api/handler/cleanup_rollback_test.go",
          "selector": "TestLegacyRollbackCannotActivateRetiredVersion"
        },
        {
          "path": "api/handler/cleanup_rollback_test.go",
          "selector": "TestExplicitUpgradeRechecksVersionUnderRetirementLock"
        },
        {
          "path": "api/handler/cleanup_rollback_test.go",
          "selector": "TestUpgradeQueueFailureCannotOverwriteNewerDeployment"
        },
        {
          "path": "api/handler/cleanup_rollback_test.go",
          "selector": "TestLegacyRollbackRejectsWrongTenant"
        },
        {
          "path": "api/handler/cleanup_rollback_test.go",
          "selector": "TestExplicitUpgradeEnqueuesValidatedVersion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.version-reference-coordination",
      "title": "Version writes serialize with manifest deletion",
      "title_zh": "Version writes serialize with manifest deletion",
      "interface_type": "workflow",
      "interface": "VersionInfoDaoImpl",
      "code_paths": [
        "db/mysql/dao/version.go",
        "pkg/cleanup/reference_mutation.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/version_cleanup_test.go",
          "selector": "TestVersionCreationCannotRaceManifestDeletion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.version-update-no-resurrection",
      "title": "Version callbacks preserve activation and never recreate retired records",
      "title_zh": "Version callbacks preserve activation and never recreate retired records",
      "interface_type": "dao_method",
      "interface": "VersionInfoDaoImpl.UpdateModel",
      "code_paths": [
        "db/mysql/dao/version.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/version_cleanup_test.go",
          "selector": "TestVersionUpdateNeverRecreatesRetiredRecordsOrResetsActivation"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.vm-activation-dispatch",
      "title": "Do not deploy VM after version activation rejection",
      "title_zh": "Do not deploy VM after version activation rejection",
      "interface_type": "workflow",
      "interface": "exectorManager.buildFromVM",
      "code_paths": [
        "builder/exector/exector.go"
      ],
      "tests": [
        {
          "path": "builder/exector/cleanup_activation_test.go",
          "selector": "TestVMBuildCannotDispatchAfterActivationRejected"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.workload-apply-admission",
      "title": "Keep workload producer admission through Kubernetes mutation and reference commit",
      "title_zh": "Keep workload producer admission through Kubernetes mutation and reference commit",
      "interface_type": "workflow",
      "interface": "handler.admitWorkload",
      "code_paths": [
        "api/handler/cleanup_workload_admission.go",
        "api/handler/resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/cleanup_workload_admission_test.go",
          "selector": "TestWorkloadAdmissionProtectsExternalApplyThroughCommit"
        },
        {
          "path": "api/handler/cleanup_workload_admission_test.go",
          "selector": "TestWorkloadAdmissionRetainsOnlyUnresolvedEffects"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cleanup.yaml-apply-admission-integration",
      "title": "Exercise YAML apply protection through HTTP and durable database outcomes",
      "title_zh": "Exercise YAML apply protection through HTTP and durable database outcomes",
      "interface_type": "workflow",
      "interface": "clusterAction.AddAppK8SResource",
      "code_paths": [
        "api/handler/resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/cleanup_workload_apply_test.go",
          "selector": "TestYAMLApplyAdmissionCoversRequestsAndPartialResults"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.cloud-storage.alioss-error-map",
      "title": "Convert AliOSS service errors into shared storage SDK errors",
      "title_zh": "\u5c06 AliOSS \u670d\u52a1\u9519\u8bef\u8f6c\u6362\u4e3a\u7edf\u4e00\u5b58\u50a8 SDK \u9519\u8bef",
      "interface_type": "workflow",
      "interface": "builder/cloudos.svcErrToS3SDKError",
      "code_paths": [
        "builder/cloudos/alioss.go"
      ],
      "tests": [
        {
          "path": "builder/cloudos/alioss_test.go",
          "selector": "TestSvcErrToS3SDKError"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cloud-storage.driver-factory",
      "title": "Dispatch cloud storage configs to the correct driver implementation",
      "title_zh": "\u5c06\u4e91\u5b58\u50a8\u914d\u7f6e\u5206\u53d1\u5230\u6b63\u786e\u7684\u9a71\u52a8\u5b9e\u73b0",
      "interface_type": "workflow",
      "interface": "builder/cloudos.New",
      "code_paths": [
        "builder/cloudos/cloudos.go"
      ],
      "tests": [
        {
          "path": "builder/cloudos/cloudos_test.go",
          "selector": "TestNewDispatchesProviderDrivers"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cloud-storage.provider-parse",
      "title": "Parse configured cloud storage provider names",
      "title_zh": "\u89e3\u6790\u4e91\u5b58\u50a8 provider \u914d\u7f6e\u503c",
      "interface_type": "workflow",
      "interface": "builder/cloudos.Str2S3Provider",
      "code_paths": [
        "builder/cloudos/cloudos.go"
      ],
      "tests": [
        {
          "path": "builder/cloudos/cloudos_test.go",
          "selector": "TestStr2S3Provider"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cloud-storage.s3-driver-config",
      "title": "Initialize S3 storage driver with the expected config",
      "title_zh": "\u6309\u9884\u671f\u914d\u7f6e\u521d\u59cb\u5316 S3 \u5b58\u50a8\u9a71\u52a8",
      "interface_type": "workflow",
      "interface": "builder/cloudos.newS3",
      "code_paths": [
        "builder/cloudos/s3.go"
      ],
      "tests": [
        {
          "path": "builder/cloudos/s3_test.go",
          "selector": "TestNewS3DriverKeepsConfig"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cluster-resource.detect-subresource",
      "title": "Detect cluster resource subresource path",
      "title_zh": "\u8bc6\u522b\u96c6\u7fa4\u8d44\u6e90\u5b50\u8def\u5f84",
      "interface_type": "workflow",
      "interface": "api/handler.containsSlash",
      "code_paths": [
        "api/handler/cluster_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/cluster_resource_test.go",
          "selector": "TestContainsSlash"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cluster-resource.exclude-terminal-pods",
      "title": "Exclude terminal pods from cluster resource allocation",
      "title_zh": "\u4ece\u96c6\u7fa4\u8d44\u6e90\u5206\u914d\u7edf\u8ba1\u4e2d\u6392\u9664\u7ec8\u6001 Pod",
      "interface_type": "workflow",
      "interface": "api/handler.(*TenantAction).initClusterResource",
      "code_paths": [
        "api/handler/tenant.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_query_scope_test.go",
          "selector": "TestInitClusterResourceExcludesTerminalPods"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cluster-resource.handler-singleton",
      "title": "Reuse singleton cluster resource handler",
      "title_zh": "\u590d\u7528\u96c6\u7fa4\u8d44\u6e90\u5904\u7406\u5668\u5355\u4f8b",
      "interface_type": "workflow",
      "interface": "api/handler.GetClusterResourceHandler",
      "code_paths": [
        "api/handler/cluster_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/cluster_resource_test.go",
          "selector": "TestGetClusterResourceHandlerSingleton"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.cluster-resource.validate-gvr",
      "title": "Validate cluster resource GVR parameters",
      "title_zh": "\u6821\u9a8c\u96c6\u7fa4\u8d44\u6e90 GVR \u53c2\u6570",
      "interface_type": "workflow",
      "interface": "api/handler.validateGVRParams",
      "code_paths": [
        "api/handler/cluster_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/cluster_resource_test.go",
          "selector": "TestValidateGVRParams"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cluster.rbd-component-readiness",
      "title": "Rainbond component readiness overview",
      "title_zh": "Rainbond component readiness overview",
      "interface_type": "handler_method",
      "interface": "api/handler.clusterAction.ListRainbondComponents",
      "code_paths": [
        "api/handler/cluster.go"
      ],
      "tests": [
        {
          "path": "api/handler/cluster_overview_test.go",
          "selector": "TestPodReadyForOverview"
        },
        {
          "path": "api/handler/cluster_overview_test.go",
          "selector": "TestBuildRainbondComponentOverviewSortsByName"
        },
        {
          "path": "api/handler/cluster_overview_test.go",
          "selector": "TestFinalizeRainbondComponentOverviewKeepsZeroPodOperatorSorted"
        },
        {
          "path": "api/handler/cluster_overview_test.go",
          "selector": "TestDeduplicateRainbondComponentPodsPreventsOverlappingCounts"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cluster.upgrade-preserves-component-config",
      "title": "Preserve custom component configuration during image upgrades",
      "title_zh": "Preserve custom component configuration during image upgrades",
      "interface_type": "view_endpoint",
      "interface": "POST /v2/cluster/rbd-upgrade",
      "code_paths": [
        "api/controller/cluster.go"
      ],
      "tests": [
        {
          "path": "api/controller/cluster_upgrade_test.go",
          "selector": "TestUpgradePreservesComponentConfig"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb-version.extract-major",
      "title": "Extract major version from CNB spec",
      "title_zh": "\u4ece CNB \u7248\u672c\u8868\u8fbe\u5f0f\u63d0\u53d6\u4e3b\u7248\u672c",
      "interface_type": "workflow",
      "interface": "builder/parser/code.extractMajorFromSpec",
      "code_paths": [
        "builder/parser/code/cnb_versions.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/cnb_versions_test.go",
          "selector": "TestExtractMajorFromSpec"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb-version.golang-order-and-default",
      "title": "Keep Go CNB versions ordered with the latest default",
      "title_zh": "\u4fdd\u6301 Go CNB \u7248\u672c\u987a\u5e8f\u5e76\u5c06\u6700\u65b0\u7248\u672c\u8bbe\u4e3a\u9ed8\u8ba4",
      "interface_type": "workflow",
      "interface": "builder/parser/code.GetCNBVersions",
      "code_paths": [
        "builder/parser/code/cnb_versions.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/cnb_versions_test.go",
          "selector": "TestGetCNBVersionsGoOrderingAndDefault"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb-version.match-golang",
      "title": "Normalize and match Go CNB version specs",
      "title_zh": "\u5f52\u4e00\u5316\u5e76\u5339\u914d Go CNB \u7248\u672c\u8868\u8fbe\u5f0f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.MatchCNBVersion",
      "code_paths": [
        "builder/parser/code/cnb_versions.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/cnb_versions_test.go",
          "selector": "TestMatchCNBVersion_Golang"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb-version.match-language",
      "title": "Match CNB version for composite language",
      "title_zh": "\u4e3a\u590d\u5408\u8bed\u8a00\u5339\u914d CNB \u7248\u672c",
      "interface_type": "workflow",
      "interface": "builder/parser/code.MatchCNBVersion",
      "code_paths": [
        "builder/parser/code/cnb_versions.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/cnb_versions_test.go",
          "selector": "TestMatchCNBVersion_CompositeLanguage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb-version.python-order-and-default",
      "title": "Keep Python CNB versions ordered with the latest default",
      "title_zh": "\u4fdd\u6301 Python CNB \u7248\u672c\u987a\u5e8f\u5e76\u5c06\u6700\u65b0\u7248\u672c\u8bbe\u4e3a\u9ed8\u8ba4",
      "interface_type": "workflow",
      "interface": "builder/parser/code.GetCNBVersions",
      "code_paths": [
        "builder/parser/code/cnb_versions.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/cnb_versions_test.go",
          "selector": "TestGetCNBVersionsPythonOrderingAndDefault"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb-version.resolve-supported",
      "title": "Resolve supported CNB versions by language",
      "title_zh": "\u6309\u8bed\u8a00\u89e3\u6790\u652f\u6301\u7684 CNB \u7248\u672c",
      "interface_type": "workflow",
      "interface": "builder/parser/code.GetCNBVersions",
      "code_paths": [
        "builder/parser/code/cnb_versions.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/cnb_versions_test.go",
          "selector": "TestGetCNBVersions"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.annotation-key-decode",
      "title": "Decode CNB annotation key into BP env name",
      "title_zh": "\u5c06 CNB \u6ce8\u89e3\u952e\u89e3\u7801\u4e3a BP \u73af\u5883\u53d8\u91cf\u540d",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.annotationKeyToBPEnv",
      "code_paths": [
        "builder/build/cnb/platform.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestAnnotationKeyToBPEnv"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.annotation-key-encode",
      "title": "Encode BP env name into CNB annotation key",
      "title_zh": "\u5c06 BP \u73af\u5883\u53d8\u91cf\u540d\u7f16\u7801\u4e3a CNB \u6ce8\u89e3\u952e",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.bpEnvToAnnotationKey",
      "code_paths": [
        "builder/build/cnb/platform.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestBpEnvToAnnotationKey"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.bp-annotation-priority",
      "title": "Keep explicit CNB annotations over BP passthrough values",
      "title_zh": "\u663e\u5f0f CNB \u6ce8\u89e3\u4f18\u5148\u4e8e BP \u900f\u4f20\u503c",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.buildPlatformAnnotations",
      "code_paths": [
        "builder/build/cnb/platform.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestBuildPlatformAnnotationsBPNoOverride"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.build-job-execution",
      "title": "Execute CNB build job lifecycle",
      "title_zh": "\u6267\u884c CNB \u6784\u5efa\u4efb\u52a1\u5168\u6d41\u7a0b",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.runCNBBuildJob",
      "code_paths": [
        "builder/build/cnb/build.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestRunCNBBuildJob"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.builder-image",
      "title": "Resolve CNB builder image from environment",
      "title_zh": "\u89e3\u6790 CNB builder \u955c\u50cf",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.GetCNBBuilderImage",
      "code_paths": [
        "builder/build/cnb/config.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestGetCNBBuilderImage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.config-file",
      "title": "Inject specific CNB config file content",
      "title_zh": "\u6ce8\u5165\u6307\u5b9a\u7684 CNB \u914d\u7f6e\u6587\u4ef6\u5185\u5bb9",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.injectConfigFile",
      "code_paths": [
        "builder/build/cnb/lang_nodejs.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestInjectConfigFile"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.creator-args",
      "title": "Build CNB creator command arguments",
      "title_zh": "\u751f\u6210 CNB creator \u547d\u4ee4\u53c2\u6570",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.buildCreatorArgs",
      "code_paths": [
        "builder/build/cnb/job.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestBuildCreatorArgs"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.creator-args-insecure-registry",
      "title": "Append insecure registry args for CNB creator",
      "title_zh": "\u4e3a CNB creator \u9644\u52a0 insecure registry \u53c2\u6570",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.buildCreatorArgs",
      "code_paths": [
        "builder/build/cnb/job.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestBuildCreatorArgsInsecureRegistry"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.dependency-mirror",
      "title": "Resolve CNB dependency mirror source",
      "title_zh": "\u89e3\u6790 CNB \u4f9d\u8d56\u955c\u50cf\u6e90",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.getDependencyMirror",
      "code_paths": [
        "builder/build/cnb/lang_nodejs.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestBuildPlatformAnnotationsMirrorDefault"
        },
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestBuildPlatformAnnotationsMirrorExplicit"
        },
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestGetDependencyMirrorOffline"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.env-vars",
      "title": "Build CNB job environment variables",
      "title_zh": "\u751f\u6210 CNB \u6784\u5efa\u4efb\u52a1\u73af\u5883\u53d8\u91cf",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.buildEnvVars",
      "code_paths": [
        "builder/build/cnb/job.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestBuildEnvVars"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.mirror-config",
      "title": "Inject CNB mirror config files by source mode",
      "title_zh": "\u6309\u6765\u6e90\u6a21\u5f0f\u6ce8\u5165 CNB \u955c\u50cf\u914d\u7f6e",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.nodejsConfig.InjectMirrorConfig",
      "code_paths": [
        "builder/build/cnb/lang_nodejs.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestInjectMirrorConfig"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.mirror-config-write-error",
      "title": "Propagate CNB mirror config write failure",
      "title_zh": "\u4f20\u64ad CNB \u955c\u50cf\u914d\u7f6e\u5199\u5165\u5931\u8d25",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.nodejsConfig.InjectMirrorConfig",
      "code_paths": [
        "builder/build/cnb/lang_nodejs.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestInjectMirrorConfigWriteError"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.new-builder",
      "title": "Create CNB builder instance",
      "title_zh": "\u521b\u5efa CNB \u6784\u5efa\u5668\u5b9e\u4f8b",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.NewBuilder",
      "code_paths": [
        "builder/build/cnb/build.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestNewBuilder"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.npm-cache-policy",
      "title": "Avoid ineffective npm registry caching while retaining image layer reuse",
      "title_zh": "Avoid ineffective npm registry caching while retaining image layer reuse",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.buildCreatorArgs",
      "code_paths": [
        "builder/build/cnb/cache_policy.go",
        "builder/build/cnb/job.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cache_policy_test.go",
          "selector": "TestCNBNPMCachePolicy"
        },
        {
          "path": "builder/build/cnb/cache_policy_test.go",
          "selector": "TestCNBCachePolicyExplainsAutomaticBypass"
        },
        {
          "path": "builder/build/cnb/cache_policy_test.go",
          "selector": "TestCNBCachePolicyPreservesCacheForUnknownSources"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.npm-global-registry",
      "title": "Export NPM_CONFIG_REGISTRY for global npm installs",
      "title_zh": "\u4e3a\u5168\u5c40 npm \u5b89\u88c5\u5bfc\u51fa NPM_CONFIG_REGISTRY",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.resolveNpmRegistry",
      "code_paths": [
        "builder/build/cnb/lang_nodejs.go",
        "builder/build/cnb/platform.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestResolveNpmRegistry"
        },
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestNodejsNpmRegistryAnnotation"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.npmrc-registry-parse",
      "title": "Parse default registry key from .npmrc content",
      "title_zh": "\u4ece .npmrc \u5185\u5bb9\u4e2d\u89e3\u6790\u9ed8\u8ba4 registry \u914d\u7f6e\u9879",
      "interface_type": "package_function",
      "interface": "builder/build/cnb.npmRegistryFromNpmrc",
      "code_paths": [
        "builder/build/cnb/lang_nodejs.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestNpmRegistryFromNpmrc"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.offline-mode",
      "title": "Resolve offline mode CNB image behavior",
      "title_zh": "\u89e3\u6790\u79bb\u7ebf\u6a21\u5f0f\u4e0b\u7684 CNB \u955c\u50cf\u884c\u4e3a",
      "interface_type": "workflow",
      "interface": "builder/build/cnb offline mode helpers",
      "code_paths": [
        "builder/build/cnb/config.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestIsOfflineMode"
        },
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestGetCNBBuilderImageOffline"
        },
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestGetCNBRunImageOffline"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.order-toml",
      "title": "Write custom CNB order definition",
      "title_zh": "\u5199\u5165\u81ea\u5b9a\u4e49 CNB order \u5b9a\u4e49",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.writeCustomOrder",
      "code_paths": [
        "builder/build/cnb/order.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestWriteCustomOrder"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.order-write-failure",
      "title": "Return empty order flag when CNB order file write fails",
      "title_zh": "CNB order \u6587\u4ef6\u5199\u5165\u5931\u8d25\u65f6\u8fd4\u56de\u7a7a\u6807\u8bb0",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.writeCustomOrder",
      "code_paths": [
        "builder/build/cnb/order.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestWriteCustomOrderFailure"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.package-workspace-isolation",
      "title": "Isolate each CNB source package build from retained generated files",
      "title_zh": "\u9694\u79bb\u6e90\u7801\u5305 CNB \u6784\u5efa\u5de5\u4f5c\u76ee\u5f55\u5e76\u4fdd\u7559\u539f\u59cb\u4e0a\u4f20\u5185\u5bb9",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.Build",
      "code_paths": [
        "builder/build/cnb/build.go",
        "builder/parser/package_workspace.go",
        "util/comman.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/package_workspace_test.go",
          "selector": "TestCNBPackageBuildUsesPristineWorkspace"
        },
        {
          "path": "builder/build/cnb/package_workspace_test.go",
          "selector": "TestCNBNonPackageBuildKeepsSourceDirectory"
        },
        {
          "path": "builder/parser/package_workspace_test.go",
          "selector": "TestPreparePackageBuildWorkspace"
        },
        {
          "path": "builder/parser/package_workspace_test.go",
          "selector": "TestPreparePackageBuildWorkspaceRejectsInvalidInput"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.phase-timing",
      "title": "Report observed CNB lifecycle phase durations without changing build output",
      "title_zh": "Report observed CNB lifecycle phase durations without changing build output",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.runCNBBuildJob",
      "code_paths": [
        "builder/build/cnb/phase_logger.go",
        "builder/build/cnb/job.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/phase_logger_test.go",
          "selector": "TestCNBPhaseTiming"
        },
        {
          "path": "builder/build/cnb/phase_logger_test.go",
          "selector": "TestCNBPhaseTimingHandlesFragmentedLogs"
        },
        {
          "path": "builder/build/cnb/phase_logger_test.go",
          "selector": "TestCNBPhaseTimingPreservesWriterErrors"
        },
        {
          "path": "builder/build/cnb/phase_logger_test.go",
          "selector": "TestCNBPhaseTimingSerializesConcurrentWrites"
        },
        {
          "path": "builder/build/cnb/phase_logger_test.go",
          "selector": "TestCNBJobEmitsFinalPhaseTiming"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.platform-annotations",
      "title": "Build CNB platform annotations from build envs",
      "title_zh": "\u6839\u636e\u6784\u5efa\u73af\u5883\u751f\u6210 CNB \u5e73\u53f0\u6ce8\u89e3",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.buildPlatformAnnotations",
      "code_paths": [
        "builder/build/cnb/platform.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestBuildPlatformAnnotations"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.platform-volume",
      "title": "Create CNB platform volume from annotations",
      "title_zh": "\u6839\u636e\u6ce8\u89e3\u521b\u5efa CNB \u5e73\u53f0\u5377",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.createPlatformVolume",
      "code_paths": [
        "builder/build/cnb/platform.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestCreatePlatformVolume"
        },
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestCreatePlatformVolumeEmpty"
        },
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestCreatePlatformVolumeNonCNBKeys"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.prebuild-job-cleanup",
      "title": "Clean up previous CNB prebuild jobs",
      "title_zh": "\u6e05\u7406\u5386\u53f2 CNB \u9884\u6784\u5efa\u4efb\u52a1",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.stopPreBuildJob",
      "code_paths": [
        "builder/build/cnb/build.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestStopPreBuildJob"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.project-file-validation",
      "title": "Validate project files before CNB build",
      "title_zh": "CNB \u6784\u5efa\u524d\u6821\u9a8c\u9879\u76ee\u6587\u4ef6",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.validateProjectFiles",
      "code_paths": [
        "builder/build/cnb/build.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestValidateProjectFiles"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.run-image",
      "title": "Resolve CNB run image from environment",
      "title_zh": "\u89e3\u6790 CNB run \u955c\u50cf",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.GetCNBRunImage",
      "code_paths": [
        "builder/build/cnb/config.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestGetCNBRunImage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.source-dir-permissions",
      "title": "Normalize source directory permissions before CNB build",
      "title_zh": "CNB \u6784\u5efa\u524d\u89c4\u8303\u5316\u6e90\u7801\u76ee\u5f55\u6743\u9650",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.setSourceDirPermissions",
      "code_paths": [
        "builder/build/cnb/build.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestSetSourceDirPermissions"
        },
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestSetSourceDirPermissionsNonexistent"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.static-buildpacks",
      "title": "Select nginx buildpack for pure static source",
      "title_zh": "\u7eaf\u9759\u6001\u6e90\u7801\u4f7f\u7528 nginx buildpack",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.staticConfig.CustomOrder",
      "code_paths": [
        "builder/build/cnb/order.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestStaticBuildpacks"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.volume-mounts",
      "title": "Create CNB build volumes and mounts",
      "title_zh": "\u521b\u5efa CNB \u6784\u5efa\u5377\u4e0e\u6302\u8f7d",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.createVolumeAndMount",
      "code_paths": [
        "builder/build/cnb/job.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestCreateVolumeAndMount"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.cnb.waiting-complete",
      "title": "Wait for CNB build job completion status",
      "title_zh": "\u7b49\u5f85 CNB \u6784\u5efa\u4efb\u52a1\u5b8c\u6210\u72b6\u6001",
      "interface_type": "workflow",
      "interface": "builder/build/cnb.Builder.waitingComplete",
      "code_paths": [
        "builder/build/cnb/job.go"
      ],
      "tests": [
        {
          "path": "builder/build/cnb/cnb_test.go",
          "selector": "TestWaitingComplete"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.component.volume-delete-blocks-shared-mount",
      "title": "Block deleting shared mounted component volumes",
      "title_zh": "Block deleting shared mounted component volumes",
      "interface_type": "handler_method",
      "interface": "api/handler.ServiceAction.VolumnVar",
      "code_paths": [
        "api/handler/service.go",
        "db/dao/dao.go",
        "db/mysql/dao/tenants.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_volume_test.go",
          "selector": "TestServiceActionVolumnVarDeleteRejectsSharedMountedVolume"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.component.volume-expansion-only-grows",
      "title": "Reject PVC volume shrink requests",
      "title_zh": "Reject PVC volume shrink requests",
      "interface_type": "handler_method",
      "interface": "api/handler.ServiceAction.UpdVolume",
      "code_paths": [
        "api/handler/service_volume_expansion.go",
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_volume_test.go",
          "selector": "TestServiceActionUpdVolumeRejectsShrink"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.component.volume-expansion-reconciles-drift",
      "title": "Reconcile PVC request with stored volume capacity",
      "title_zh": "Reconcile PVC request with stored volume capacity",
      "interface_type": "handler_method",
      "interface": "api/handler.ServiceAction.UpdVolume",
      "code_paths": [
        "api/handler/service_volume_expansion.go",
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_volume_test.go",
          "selector": "TestServiceActionUpdVolumeReconcilesStoredCapacity"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.component.volume-expansion-status",
      "title": "Report PVC volume expansion capability and status",
      "title_zh": "Report PVC volume expansion capability and status",
      "interface_type": "handler_method",
      "interface": "api/handler.ServiceAction.GetVolumes",
      "code_paths": [
        "api/handler/service_volume_expansion.go",
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_volume_expansion_test.go",
          "selector": "TestInspectVolumeExpansion"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.component.volume-expansion-updates-claims",
      "title": "Expand every PVC for a component volume",
      "title_zh": "Expand every PVC for a component volume",
      "interface_type": "handler_method",
      "interface": "api/handler.ServiceAction.UpdVolume",
      "code_paths": [
        "api/handler/service_volume_expansion.go",
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_volume_expansion_test.go",
          "selector": "TestExpandVolumeClaims"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.component.volume-path-update-without-expansion",
      "title": "Path edits with unchanged capacity do not require PVC expansion support",
      "title_zh": "Path edits with unchanged capacity do not require PVC expansion support",
      "interface_type": "handler_method",
      "interface": "ServiceAction.UpdVolume",
      "code_paths": [
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_volume_test.go",
          "selector": "TestServiceActionUpdVolumePathDoesNotRequireExpansion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.component.volume-update-persists-capacity",
      "title": "Persist component volume capacity updates",
      "title_zh": "\u6301\u4e45\u5316\u7ec4\u4ef6\u5b58\u50a8\u5bb9\u91cf\u66f4\u65b0",
      "interface_type": "handler_method",
      "interface": "api/handler.ServiceAction.UpdVolume",
      "code_paths": [
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_volume_test.go",
          "selector": "TestServiceActionUpdVolumeUpdatesVolumeCapacity"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.component.volume-update-preserves-capacity",
      "title": "Preserve volume capacity in update request payloads",
      "title_zh": "\u7ec4\u4ef6\u5b58\u50a8\u66f4\u65b0\u8bf7\u6c42\u4fdd\u7559\u5bb9\u91cf\u5b57\u6bb5",
      "interface_type": "other",
      "interface": "api/model.UpdVolumeReq",
      "code_paths": [
        "api/model/volume.go"
      ],
      "tests": [
        {
          "path": "api/model/volume_test.go",
          "selector": "TestUpdVolumeReqPreservesVolumeCapacityFromJSON"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.compose.config-volume-file-content",
      "title": "Preserve config volume file content field semantics",
      "title_zh": "\u4fdd\u7559\u914d\u7f6e\u5377\u6587\u4ef6\u5185\u5bb9\u5b57\u6bb5\u8bed\u4e49",
      "interface_type": "workflow",
      "interface": "builder/parser/types.Volume.FileContent",
      "code_paths": [
        "builder/parser/types/types.go"
      ],
      "tests": [
        {
          "path": "builder/parser/file_content_test.go",
          "selector": "TestVolumeFileContent"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.compose.config-volume-path-mode",
      "title": "Docker Compose config volumes keep container path and mode",
      "title_zh": "Docker Compose config volumes keep container path and mode",
      "interface_type": "workflow",
      "interface": "builder/parser.DockerComposeParse.Parse",
      "code_paths": [
        "builder/parser/docker_compose.go",
        "builder/parser/compose/volume_helpers.go"
      ],
      "tests": [
        {
          "path": "builder/parser/docker_compose_warnings_test.go",
          "selector": "TestDockerComposeParseConfigVolumeUsesContainerPathAndMode"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.compose.detect-config-file-mount",
      "title": "Detect config-file style bind mounts",
      "title_zh": "\u8bc6\u522b\u914d\u7f6e\u6587\u4ef6\u7c7b\u578b\u7684\u6302\u8f7d\u8def\u5f84",
      "interface_type": "workflow",
      "interface": "builder/parser/compose.isConfigFile",
      "code_paths": [
        "builder/parser/compose/version_detect.go"
      ],
      "tests": [
        {
          "path": "builder/parser/compose/version_detect_test.go",
          "selector": "TestIsConfigFile"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.compose.detect-version",
      "title": "Infer compose file version from features",
      "title_zh": "\u6839\u636e\u8bed\u6cd5\u7279\u5f81\u63a8\u65ad compose \u7248\u672c",
      "interface_type": "workflow",
      "interface": "builder/parser/compose.inferComposeVersion",
      "code_paths": [
        "builder/parser/compose/version_detect.go"
      ],
      "tests": [
        {
          "path": "builder/parser/compose/version_detect_test.go",
          "selector": "TestInferComposeVersion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.compose.missing-file-bind-warning",
      "title": "Warn when missing bind mount looks like a file",
      "title_zh": "Warn when missing bind mount looks like a file",
      "interface_type": "workflow",
      "interface": "builder/parser.DockerComposeParse.Parse",
      "code_paths": [
        "builder/parser/docker_compose.go"
      ],
      "tests": [
        {
          "path": "builder/parser/docker_compose_warnings_test.go",
          "selector": "TestDockerComposeParseWarnsMissingFileLikeBindMount"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.compose.parse-warnings",
      "title": "Parse docker compose file and return degraded warnings",
      "title_zh": "\u89e3\u6790 docker compose \u5e76\u8fd4\u56de\u964d\u7ea7\u544a\u8b66",
      "interface_type": "workflow",
      "interface": "builder/parser.CreateDockerComposeParse.Parse",
      "code_paths": [
        "builder/parser/docker_compose.go"
      ],
      "tests": [
        {
          "path": "builder/parser/docker_compose_warnings_test.go",
          "selector": "TestDockerComposeParseWithWarnings"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.compose.preserve-volume-source-path",
      "title": "Preserve docker compose volume source paths",
      "title_zh": "Preserve docker compose volume source paths",
      "interface_type": "package_function",
      "interface": "builder/parser/compose.loadV3Volumes",
      "code_paths": [
        "builder/parser/compose/version3.go"
      ],
      "tests": [
        {
          "path": "builder/parser/compose/version_detect_test.go",
          "selector": "TestLoadV3VolumesPreservesSourcePathUnderscores"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.compose.yaml-anchor-support",
      "title": "Support YAML anchors in docker compose parsing",
      "title_zh": "\u652f\u6301 docker compose \u4e2d\u7684 YAML anchors",
      "interface_type": "workflow",
      "interface": "builder/parser.CreateDockerComposeParse.Parse",
      "code_paths": [
        "builder/parser/docker_compose.go"
      ],
      "tests": [
        {
          "path": "builder/parser/docker_compose_warnings_test.go",
          "selector": "TestDockerComposeParseWithYAMLAnchors"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.config-file.dependent-configmap-ownership",
      "title": "Dependent config maps keep provider ownership",
      "title_zh": "\u4f9d\u8d56\u914d\u7f6e\u6587\u4ef6\u4fdd\u6301\u63d0\u4f9b\u65b9\u6240\u6709\u6743",
      "interface_type": "workflow",
      "interface": "worker/appm/volume.ConfigFileVolume.CreateDependVolume",
      "code_paths": [
        "worker/appm/volume/config-file.go",
        "worker/appm/controller/upgrade.go",
        "worker/appm/types/v1/labels.go"
      ],
      "tests": [
        {
          "path": "worker/appm/volume/share_file_vm_test.go",
          "selector": "TestConfigFileVolumeCreateDependVolumeUsesProviderConfigMap"
        },
        {
          "path": "worker/appm/volume/share_file_vm_test.go",
          "selector": "TestConfigFileVolumeCreateDependVolumeForVMUsesProviderIdentity"
        },
        {
          "path": "worker/appm/controller/upgrade_test.go",
          "selector": "TestUpgradeConfigMapLeavesExistingDependencyConfigMapToProvider"
        },
        {
          "path": "worker/appm/controller/upgrade_test.go",
          "selector": "TestUpgradeConfigMapCreatesMissingDependencyConfigMapForProvider"
        },
        {
          "path": "worker/appm/controller/upgrade_test.go",
          "selector": "TestUpgradeConfigMapDoesNotDeleteProviderDependency"
        },
        {
          "path": "worker/appm/controller/upgrade_test.go",
          "selector": "TestUpgradeConfigMapReclaimsLegacyProviderConfigMap"
        },
        {
          "path": "worker/appm/controller/upgrade_test.go",
          "selector": "TestUpgradeConfigMapDoesNotAdoptForeignCollision"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.config-file.dependent-source-key",
      "title": "Dependent config files use provider source keys",
      "title_zh": "\u4f9d\u8d56\u914d\u7f6e\u6587\u4ef6\u4f7f\u7528\u63d0\u4f9b\u65b9\u6e90\u6587\u4ef6\u952e",
      "interface_type": "workflow",
      "interface": "worker/appm/volume.ConfigFileVolume.CreateDependVolume",
      "code_paths": [
        "worker/appm/volume/config-file.go",
        "worker/appm/controller/upgrade.go"
      ],
      "tests": [
        {
          "path": "worker/appm/volume/share_file_vm_test.go",
          "selector": "TestConfigFileVolumeCreateDependVolumeUsesProviderFileKey"
        },
        {
          "path": "worker/appm/volume/share_file_vm_test.go",
          "selector": "TestConfigFileVolumeCreateDependVolumeForVMUsesProviderFileKey"
        },
        {
          "path": "worker/appm/controller/upgrade_test.go",
          "selector": "TestUpgradeConfigMapMigratesOnlyLegacyDependentSourceKey"
        },
        {
          "path": "worker/appm/controller/upgrade_test.go",
          "selector": "TestUpgradeConfigMapMigratesOnlyKnownLegacyConsumerConfigMap"
        },
        {
          "path": "worker/appm/controller/upgrade_test.go",
          "selector": "TestUpgradeConfigMapRetriesDependentMigrationConflict"
        },
        {
          "path": "worker/appm/controller/upgrade_test.go",
          "selector": "TestUpgradeConfigMapHandlesDependentCreateRace"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.config-file.k8s-volume-name-safe",
      "title": "Keep config-file Kubernetes volume names DNS-safe",
      "title_zh": "Keep config-file Kubernetes volume names DNS-safe",
      "interface_type": "workflow",
      "interface": "worker/appm/volume.ConfigFileVolume.CreateVolume",
      "code_paths": [
        "worker/appm/volume/config-file.go",
        "worker/appm/volume/volume.go"
      ],
      "tests": [
        {
          "path": "worker/appm/volume/share_file_vm_test.go",
          "selector": "TestConfigFileVolumeCreateVolumeForDeploymentUsesK8sSafeVolumeName"
        },
        {
          "path": "worker/appm/volume/share_file_vm_test.go",
          "selector": "TestConfigFileVolumeCreateDependVolumeForDeploymentUsesK8sSafeVolumeName"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.config-files.detect",
      "title": "Detect npm and yarn config files in source tree",
      "title_zh": "\u8bc6\u522b\u6e90\u7801\u76ee\u5f55\u4e2d\u7684 npm \u548c yarn \u914d\u7f6e\u6587\u4ef6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectConfigFiles",
      "code_paths": [
        "builder/parser/code/config_files.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/config_files_test.go",
          "selector": "TestDetectConfigFiles_Npmrc"
        },
        {
          "path": "builder/parser/code/config_files_test.go",
          "selector": "TestDetectConfigFiles_YarnrcClassic"
        },
        {
          "path": "builder/parser/code/config_files_test.go",
          "selector": "TestDetectConfigFiles_YarnrcYml"
        },
        {
          "path": "builder/parser/code/config_files_test.go",
          "selector": "TestDetectConfigFiles_Multiple"
        },
        {
          "path": "builder/parser/code/config_files_test.go",
          "selector": "TestDetectConfigFiles_None"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.config-files.has-any",
      "title": "Detect whether source tree has any package manager config file",
      "title_zh": "\u68c0\u6d4b\u6e90\u7801\u4e2d\u662f\u5426\u5b58\u5728\u5305\u7ba1\u7406\u5668\u914d\u7f6e\u6587\u4ef6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ConfigFiles.HasAnyConfigFile",
      "code_paths": [
        "builder/parser/code/config_files.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/config_files_test.go",
          "selector": "TestConfigFiles_HasAnyConfigFile"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.config-files.read-npmrc",
      "title": "Read npmrc content from source tree",
      "title_zh": "\u8bfb\u53d6\u6e90\u7801\u4e2d\u7684 npmrc \u5185\u5bb9",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ConfigFiles.GetNpmrcContent",
      "code_paths": [
        "builder/parser/code/config_files.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/config_files_test.go",
          "selector": "TestConfigFiles_GetNpmrcContent"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.config-files.read-yarnrc",
      "title": "Read yarnrc content from source tree",
      "title_zh": "\u8bfb\u53d6\u6e90\u7801\u4e2d\u7684 yarnrc \u5185\u5bb9",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ConfigFiles.GetYarnrcContent",
      "code_paths": [
        "builder/parser/code/config_files.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/config_files_test.go",
          "selector": "TestConfigFiles_GetYarnrcContent"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.config-files.resolve-relevant-file",
      "title": "Resolve relevant config file for package manager",
      "title_zh": "\u4e3a\u5305\u7ba1\u7406\u5668\u9009\u62e9\u76f8\u5173\u914d\u7f6e\u6587\u4ef6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ConfigFiles.GetRelevantConfigFile",
      "code_paths": [
        "builder/parser/code/config_files.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/config_files_test.go",
          "selector": "TestConfigFiles_GetRelevantConfigFile"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.dockerfile-build.proxy-env-inheritance",
      "title": "Dockerfile BuildKit proxy environment inheritance",
      "title_zh": "Dockerfile BuildKit proxy environment inheritance",
      "interface_type": "workflow",
      "interface": "builder/build.buildKitProxyEnvVars",
      "code_paths": [
        "builder/build/dockerfile_build.go"
      ],
      "tests": [
        {
          "path": "builder/build/dockerfile_build_test.go",
          "selector": "TestBuildKitProxyEnvVars"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.dockerfile-build.registry-mirror-toml",
      "title": "Render BuildKit TOML with optional registry mirrors",
      "title_zh": "Render BuildKit TOML with optional registry mirrors",
      "interface_type": "workflow",
      "interface": "builder/sources.buildKitTomlContent",
      "code_paths": [
        "builder/sources/image.go"
      ],
      "tests": [
        {
          "path": "builder/sources/buildkit_toml_test.go",
          "selector": "TestBuildKitTomlContent"
        },
        {
          "path": "builder/sources/buildkit_toml_test.go",
          "selector": "TestBuildKitTomlContentLegacyEquivalence"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.dockerfile.line-info",
      "title": "Track Dockerfile AST line information",
      "title_zh": "\u8ddf\u8e2a Dockerfile AST \u7684\u884c\u53f7\u4fe1\u606f",
      "interface_type": "workflow",
      "interface": "util/dockerfile/parser.Parse",
      "code_paths": [
        "util/dockerfile/parser/parser.go"
      ],
      "tests": [
        {
          "path": "util/dockerfile/parser/parser_test.go",
          "selector": "TestLineInformation"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.dockerfile.parse-fixtures",
      "title": "Parse canonical Dockerfile fixtures into stable ASTs",
      "title_zh": "\u5c06\u6807\u51c6 Dockerfile \u793a\u4f8b\u89e3\u6790\u4e3a\u7a33\u5b9a AST",
      "interface_type": "workflow",
      "interface": "util/dockerfile/parser.Parse",
      "code_paths": [
        "util/dockerfile/parser/parser.go"
      ],
      "tests": [
        {
          "path": "util/dockerfile/parser/parser_test.go",
          "selector": "TestTestData"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.dockerfile.parse-json-array",
      "title": "Parse JSON array syntax in Dockerfile instructions",
      "title_zh": "\u89e3\u6790 Dockerfile \u6307\u4ee4\u4e2d\u7684 JSON \u6570\u7ec4\u8bed\u6cd5",
      "interface_type": "workflow",
      "interface": "util/dockerfile/parser.parseJSON",
      "code_paths": [
        "util/dockerfile/parser/line_parsers.go"
      ],
      "tests": [
        {
          "path": "util/dockerfile/parser/json_test.go",
          "selector": "TestJSONArraysOfStrings"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.dockerfile.parse-words",
      "title": "Split Dockerfile instruction words with quoting rules",
      "title_zh": "\u6309\u5f15\u53f7\u4e0e\u8f6c\u4e49\u89c4\u5219\u62c6\u5206 Dockerfile \u6307\u4ee4\u53c2\u6570",
      "interface_type": "workflow",
      "interface": "util/dockerfile/parser.parseWords",
      "code_paths": [
        "util/dockerfile/parser/parser.go"
      ],
      "tests": [
        {
          "path": "util/dockerfile/parser/parser_test.go",
          "selector": "TestParseWords"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.dockerfile.reject-invalid",
      "title": "Reject invalid Dockerfile fixtures during parsing",
      "title_zh": "\u89e3\u6790 Dockerfile \u65f6\u62d2\u7edd\u65e0\u6548\u793a\u4f8b",
      "interface_type": "workflow",
      "interface": "util/dockerfile/parser.Parse",
      "code_paths": [
        "util/dockerfile/parser/parser.go"
      ],
      "tests": [
        {
          "path": "util/dockerfile/parser/parser_test.go",
          "selector": "TestTestNegative"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.endpoint.address-split",
      "title": "Split endpoint addresses from schemes and ports",
      "title_zh": "\u4ece\u534f\u8bae\u4e0e\u7aef\u53e3\u4e2d\u62c6\u5206\u7aef\u70b9\u5730\u5740",
      "interface_type": "workflow",
      "interface": "util/endpoint.SplitEndpointAddress",
      "code_paths": [
        "util/endpoint/validation.go"
      ],
      "tests": [
        {
          "path": "util/endpoint/validation_test.go",
          "selector": "TestSplitEndpointAddress"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.endpoint.domain-not-ip",
      "title": "Detect when endpoint addresses should be treated as domains instead of IPs",
      "title_zh": "\u5224\u65ad\u7aef\u70b9\u5730\u5740\u5e94\u6309\u57df\u540d\u800c\u4e0d\u662f IP \u5904\u7406",
      "interface_type": "workflow",
      "interface": "util/endpoint.IsDomainNotIP",
      "code_paths": [
        "util/endpoint/validation.go"
      ],
      "tests": [
        {
          "path": "util/endpoint/validation_test.go",
          "selector": "TestIsDomainNotIP"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.endpoint.domain-validate",
      "title": "Validate endpoint domains and wildcard domains",
      "title_zh": "\u6821\u9a8c\u7aef\u70b9\u57df\u540d\u53ca\u901a\u914d\u57df\u540d",
      "interface_type": "workflow",
      "interface": "util/endpoint.ValidateDomain",
      "code_paths": [
        "util/endpoint/validation.go"
      ],
      "tests": [
        {
          "path": "util/endpoint/validation_test.go",
          "selector": "TestValidateDomain"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.endpoint.ip-validate",
      "title": "Validate endpoint IP addresses and reject restricted ranges",
      "title_zh": "\u6821\u9a8c\u7aef\u70b9 IP \u5730\u5740\u5e76\u62d2\u7edd\u53d7\u9650\u7f51\u6bb5",
      "interface_type": "workflow",
      "interface": "util/endpoint.ValidateEndpointIP",
      "code_paths": [
        "util/endpoint/validation.go"
      ],
      "tests": [
        {
          "path": "util/endpoint/validation_test.go",
          "selector": "TestValidateEndpointIP"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.env-var.noop-update",
      "title": "Treat no-op component env updates as success",
      "title_zh": "Treat no-op component env updates as success",
      "interface_type": "dao_method",
      "interface": "db.mysql.dao.TenantServiceEnvVarDaoImpl.UpdateModelByAttrName",
      "code_paths": [
        "db/mysql/dao/tenants.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/tenant_service_env_var_test.go",
          "selector": "TestTenantServiceEnvVarDaoUpdateModelByAttrNameNoopSucceeds"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.envutil.custom-memory",
      "title": "Decide whether memory sizes are custom or predefined",
      "title_zh": "\u5224\u65ad\u5185\u5b58\u5927\u5c0f\u662f\u81ea\u5b9a\u4e49\u503c\u8fd8\u662f\u9884\u8bbe\u503c",
      "interface_type": "workflow",
      "interface": "util/envutil.IsCustomMemory",
      "code_paths": [
        "util/envutil/envutil.go"
      ],
      "tests": [
        {
          "path": "util/envutil/envutil_test.go",
          "selector": "TestIsCustomMemory"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.envutil.getenv-default",
      "title": "Return default values for missing environment variables in envutil",
      "title_zh": "\u5728 envutil \u4e2d\u4e3a\u7f3a\u5931\u73af\u5883\u53d8\u91cf\u8fd4\u56de\u9ed8\u8ba4\u503c",
      "interface_type": "workflow",
      "interface": "util/envutil.GetenvDefault",
      "code_paths": [
        "util/envutil/envutil.go"
      ],
      "tests": [
        {
          "path": "util/envutil/envutil_test.go",
          "selector": "TestGetenvDefault"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.envutil.memory-label",
      "title": "Map memory sizes to preset memory labels",
      "title_zh": "\u5c06\u5185\u5b58\u5927\u5c0f\u6620\u5c04\u4e3a\u9884\u8bbe\u5185\u5b58\u6807\u7b7e",
      "interface_type": "workflow",
      "interface": "util/envutil.GetMemoryType",
      "code_paths": [
        "util/envutil/envutil.go"
      ],
      "tests": [
        {
          "path": "util/envutil/envutil_test.go",
          "selector": "TestGetMemoryType"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.event-log.require-log-identity",
      "title": "Reject log list requests without a component identity",
      "title_zh": "Reject log list requests without a component identity",
      "interface_type": "view_endpoint",
      "interface": "GET /v2/cluster/log-file",
      "code_paths": [
        "api/controller/event_log.go"
      ],
      "tests": [
        {
          "path": "api/controller/event_log_test.go",
          "selector": "TestLogListRejectsMissingLogIdentity"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.eventlog.file-store",
      "title": "Append, read, delete and clean event log file store",
      "title_zh": "\u4e8b\u4ef6\u65e5\u5fd7\u6587\u4ef6\u5b58\u50a8\u7684\u8ffd\u52a0\u8bfb\u53d6\u4e0e\u6e05\u7406",
      "interface_type": "workflow",
      "interface": "api/eventlog/store.JSONLinesFileStore",
      "code_paths": [
        "api/eventlog/store/filestore.go"
      ],
      "tests": [
        {
          "path": "api/eventlog/store/filestore_test.go",
          "selector": "TestJSONLinesFileStore"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.eventlog.file-store-concurrency",
      "title": "Support concurrent appends in event log file store",
      "title_zh": "\u4e8b\u4ef6\u65e5\u5fd7\u6587\u4ef6\u5b58\u50a8\u652f\u6301\u5e76\u53d1\u5199\u5165",
      "interface_type": "workflow",
      "interface": "api/eventlog/store.JSONLinesFileStore.Append",
      "code_paths": [
        "api/eventlog/store/filestore.go"
      ],
      "tests": [
        {
          "path": "api/eventlog/store/filestore_test.go",
          "selector": "TestFileStoreConcurrency"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.file-operate.upload-folder-path-traversal",
      "title": "Reject unsafe folder upload relative paths",
      "title_zh": "\u6587\u4ef6\u64cd\u4f5c\u4e0a\u4f20\u62d2\u7edd\u4e0d\u5b89\u5168\u76f8\u5bf9\u8def\u5f84",
      "interface_type": "handler_method",
      "interface": "api/controller.resolveUploadRelativePath",
      "code_paths": [
        "api/controller/service_monitor.go"
      ],
      "tests": [
        {
          "path": "api/controller/service_monitor_upload_test.go",
          "selector": "TestResolveUploadRelativePathRejectsTraversal"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.file-operate.upload-folder-relative-path",
      "title": "Preserve folder paths during file operation uploads",
      "title_zh": "\u6587\u4ef6\u64cd\u4f5c\u4e0a\u4f20\u4fdd\u7559\u6587\u4ef6\u5939\u8def\u5f84",
      "interface_type": "handler_method",
      "interface": "api/controller.resolveUploadRelativePath",
      "code_paths": [
        "api/controller/service_monitor.go"
      ],
      "tests": [
        {
          "path": "api/controller/service_monitor_upload_test.go",
          "selector": "TestResolveUploadRelativePathPreservesFolderFromContentDisposition"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.filepersistence.volcengine-client-init",
      "title": "Initialize and reuse Volcengine NAS clients idempotently",
      "title_zh": "\u5e42\u7b49\u521d\u59cb\u5316\u5e76\u590d\u7528\u706b\u5c71\u5f15\u64ce NAS \u5ba2\u6237\u7aef",
      "interface_type": "workflow",
      "interface": "pkg/component/filepersistence.VolcengineProvider.init",
      "code_paths": [
        "pkg/component/filepersistence/volcengine.go"
      ],
      "tests": [
        {
          "path": "pkg/component/filepersistence/volcengine_test.go",
          "selector": "TestVolcengineProviderInitIsIdempotent"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.angular-spa",
      "title": "Detect Angular SPA framework",
      "title_zh": "\u8bc6\u522b Angular SPA \u6a21\u5f0f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_Angular_SPA"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.angular-ssr",
      "title": "Detect Angular SSR framework",
      "title_zh": "\u8bc6\u522b Angular SSR \u6a21\u5f0f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_Angular_SSR"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.cra",
      "title": "Detect Create React App framework",
      "title_zh": "\u8bc6\u522b Create React App \u6846\u67b6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_CRA"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.display-name",
      "title": "Resolve framework display name",
      "title_zh": "\u89e3\u6790\u6846\u67b6\u5c55\u793a\u540d\u79f0",
      "interface_type": "workflow",
      "interface": "builder/parser/code.GetDisplayName",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestGetDisplayName"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.express",
      "title": "Detect Express framework",
      "title_zh": "\u8bc6\u522b Express \u6846\u67b6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_Express"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.nestjs",
      "title": "Detect NestJS framework",
      "title_zh": "\u8bc6\u522b NestJS \u6846\u67b6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_NestJS"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.nextjs",
      "title": "Detect Next.js framework from source tree",
      "title_zh": "\u4ece\u6e90\u7801\u76ee\u5f55\u8bc6\u522b Next.js \u6846\u67b6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_NextJS"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.nextjs-no-config",
      "title": "Detect Next.js without config file",
      "title_zh": "\u65e0\u914d\u7f6e\u6587\u4ef6\u65f6\u8bc6\u522b Next.js",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_NextJS_NoConfigFile"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.nextjs-ssr",
      "title": "Detect Next.js SSR mode",
      "title_zh": "\u8bc6\u522b Next.js SSR \u6a21\u5f0f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_NextJS_SSR"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.nextjs-static-export",
      "title": "Detect Next.js static export mode",
      "title_zh": "\u8bc6\u522b Next.js \u9759\u6001\u5bfc\u51fa\u6a21\u5f0f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_NextJS_StaticExport"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.no-framework",
      "title": "Return no framework for plain Node project",
      "title_zh": "\u666e\u901a Node \u9879\u76ee\u4e0d\u8bc6\u522b\u6846\u67b6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_NoFramework"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.no-package-json",
      "title": "Return no framework when package.json is missing",
      "title_zh": "\u7f3a\u5c11 package.json \u65f6\u4e0d\u8bc6\u522b\u524d\u7aef\u6846\u67b6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_NoPackageJSON"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.nuxt",
      "title": "Detect Nuxt framework from source tree",
      "title_zh": "\u4ece\u6e90\u7801\u76ee\u5f55\u8bc6\u522b Nuxt \u6846\u67b6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_Nuxt"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.nuxt-static-target",
      "title": "Detect Nuxt static target mode",
      "title_zh": "\u8bc6\u522b Nuxt \u9759\u6001\u76ee\u6807\u6a21\u5f0f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_Nuxt_StaticTarget"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.nuxt3-ssr-false",
      "title": "Detect Nuxt3 with ssr disabled",
      "title_zh": "\u8bc6\u522b\u5173\u95ed SSR \u7684 Nuxt3",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_Nuxt3_SSRFalse"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.nuxt3-static",
      "title": "Detect Nuxt3 nitro static mode",
      "title_zh": "\u8bc6\u522b Nuxt3 \u9759\u6001\u8f93\u51fa\u6a21\u5f0f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_Nuxt3_NitroStatic"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.supported-list",
      "title": "List supported frontend frameworks",
      "title_zh": "\u5217\u51fa\u652f\u6301\u8bc6\u522b\u7684\u524d\u7aef\u6846\u67b6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.GetSupportedFrameworks",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestGetSupportedFrameworks"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.version-normalization",
      "title": "Normalize framework dependency version strings",
      "title_zh": "\u89c4\u8303\u5316\u6846\u67b6\u4f9d\u8d56\u7248\u672c\u53f7",
      "interface_type": "workflow",
      "interface": "builder/parser/code.cleanVersion",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestCleanVersion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.framework-detect.vite",
      "title": "Detect Vite framework",
      "title_zh": "\u8bc6\u522b Vite \u6846\u67b6",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectFramework",
      "code_paths": [
        "builder/parser/code/framework.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/framework_test.go",
          "selector": "TestDetectFramework_Vite"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.allocate-lb-port",
      "title": "Allocate available gateway load balancer port",
      "title_zh": "\u5206\u914d\u53ef\u7528\u7f51\u5173\u8d1f\u8f7d\u5747\u8861\u7aef\u53e3",
      "interface_type": "workflow",
      "interface": "api/handler.selectAvailablePort",
      "code_paths": [
        "api/handler/gateway_action.go"
      ],
      "tests": [
        {
          "path": "api/handler/gateway_action_test.go",
          "selector": "TestSelectAvailablePort"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.auto-certificate-route-lifecycle",
      "title": "Reconcile automatic certificate resources across route ownership changes",
      "title_zh": "Reconcile automatic certificate resources across route ownership changes",
      "interface_type": "workflow",
      "interface": "automatic certificate route lifecycle",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestEnsureCertManagerResourcesAdoptsExistingRouteOwnership"
        },
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestDeleteCertManagerResourcesRemovesCertificateAndTLS"
        },
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestCertManagerRouteNameUsesResourceSegment"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.certificate-resource-consistency",
      "title": "Keep gateway certificate resources consistent",
      "title_zh": "Keep gateway certificate resources consistent",
      "interface_type": "handler_method",
      "interface": "api/handler.GatewayAction.AddGatewayCertificate",
      "code_paths": [
        "api/handler/gateway_action.go"
      ],
      "tests": [
        {
          "path": "api/handler/gateway_action_test.go",
          "selector": "TestGatewayCertificateResourceConsistency"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.client-ca-lifecycle",
      "title": "Manage gateway client CA lifecycle",
      "title_zh": "Manage gateway client CA lifecycle",
      "interface_type": "handler_method",
      "interface": "api/handler.GatewayAction.AddGatewayClientCA",
      "code_paths": [
        "api/handler/gateway_action.go",
        "api/model/gateway_model.go"
      ],
      "tests": [
        {
          "path": "api/handler/gateway_action_test.go",
          "selector": "TestGatewayClientCALifecycle"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.domain-mtls",
      "title": "Configure inbound mTLS per gateway domain",
      "title_zh": "Configure inbound mTLS per gateway domain",
      "interface_type": "handler_method",
      "interface": "api/handler.GatewayAction.ConfigureGatewayDomainMTLS",
      "code_paths": [
        "api/handler/gateway_action.go",
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/handler/gateway_action_test.go",
          "selector": "TestGatewayDomainMTLS"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.http-route-delete-component-event",
      "title": "Record component event when deleting Gateway HTTPRoute",
      "title_zh": "\u5220\u9664\u7f51\u5173 HTTPRoute \u65f6\u8bb0\u5f55\u7ec4\u4ef6\u4e8b\u4ef6",
      "interface_type": "service_method",
      "interface": "github.com/goodrain/rainbond/api/handler.(*GatewayAction).DeleteGatewayHTTPRoute",
      "code_paths": [
        "api/handler/gateway_action.go"
      ],
      "tests": [
        {
          "path": "api/handler/gateway_action_test.go",
          "selector": "TestCreateGatewayHTTPRouteDeleteEvents"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.http-route-source-ip-validation",
      "title": "Normalize and validate HTTP route source IP restrictions",
      "title_zh": "Normalize and validate HTTP route source IP restrictions",
      "interface_type": "handler_method",
      "interface": "api/controller/apigateway.Struct.CreateHTTPAPIRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_remote_addrs_test.go",
          "selector": "TestCreateHTTPAPIRouteNormalizesRemoteAddrs"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.http-route-stable-rule-name",
      "title": "Keep APISIX HTTP route rule identity stable",
      "title_zh": "Keep APISIX HTTP route rule identity stable",
      "interface_type": "workflow",
      "interface": "api/controller/apigateway.Struct.CreateHTTPAPIRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestStableHTTPRouteRuleName"
        },
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestHTTPRouteCreateFailure"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.prevent-tcp-route-delete-recreation-race",
      "title": "Protect recreated TCP route Services with UID delete preconditions",
      "title_zh": "Protect recreated TCP route Services with UID delete preconditions",
      "interface_type": "workflow",
      "interface": "api/controller/apigateway.Struct.DeleteTCPRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestDeleteTCPRouteDoesNotDeleteRecreatedServiceWithStaleUID"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.protect-tcp-route-service-ownership",
      "title": "Reject TCP route updates for missing or different Service owners",
      "title_zh": "Reject TCP route updates for missing or different Service owners",
      "interface_type": "workflow",
      "interface": "api/controller/apigateway.Struct.CreateTCPRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestCreateTCPRouteRejectsExistingServiceWithoutMatchingOwner"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.protect-unlabeled-tcp-route-service",
      "title": "Do not delete unlabeled TCP route Services for owned requests",
      "title_zh": "Do not delete unlabeled TCP route Services for owned requests",
      "interface_type": "workflow",
      "interface": "api/controller/apigateway.Struct.DeleteTCPRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestDeleteTCPRouteWithServiceIDDoesNotDeleteUnlabeledService"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.reassign-conflicting-imported-tcp-port",
      "title": "Reassign imported TCP ports that conflict with existing NodePorts",
      "interface_type": "package_function",
      "interface": "api/handler.reassignConflictingTCPRulePorts",
      "code_paths": [
        "api/handler/gateway_action.go"
      ],
      "tests": [
        {
          "path": "api/handler/gateway_action_test.go",
          "selector": "TestReassignConflictingTCPRulePorts"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.reconcile-stale-tcp-nodeport-rules",
      "title": "Reconcile stale TCP NodePort database rules after Kubernetes allocation",
      "title_zh": "Reconcile stale TCP NodePort database rules after Kubernetes allocation",
      "interface_type": "workflow",
      "interface": "api/controller/apigateway.Struct.CreateTCPRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestCreateTCPRouteReconcilesStaleDatabaseRules"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.reject-duplicate-tcp-nodeport",
      "title": "Reject duplicate TCP NodePort bindings",
      "title_zh": "Reject duplicate TCP NodePort bindings",
      "interface_type": "workflow",
      "interface": "TCP NodePort binding",
      "code_paths": [
        "db/mysql/dao/gateway.go",
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/gateway_test.go",
          "selector": "TestTCPRuleDaoAddModelRejectsPortOwnedByAnotherRule"
        },
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestCreateTCPRouteRejectsExplicitPortOwnedByAnotherService"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.release-absent-tcp-nodeport-owner",
      "title": "Release only the requested owner when a TCP route Service is absent",
      "title_zh": "Release only the requested owner when a TCP route Service is absent",
      "interface_type": "workflow",
      "interface": "api/controller/apigateway.Struct.DeleteTCPRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestDeleteTCPRouteAlreadyAbsentReleasesOnlyRequestedOwner"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.release-captured-tcp-nodeport-rules",
      "title": "Release only TCP NodePort rules captured before Service deletion",
      "title_zh": "Release only TCP NodePort rules captured before Service deletion",
      "interface_type": "workflow",
      "interface": "api/controller/apigateway.Struct.DeleteTCPRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestDeleteTCPRouteReleasesOnlyCapturedRuleIDs"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.report-tcp-service-create-error-details",
      "title": "TCP route creation reports Kubernetes error details",
      "title_zh": "TCP route creation reports Kubernetes error details",
      "interface_type": "view_endpoint",
      "interface": "POST /api-gateway/v1/{tenant_name}/routes/tcp",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestCreateTCPRouteReportsServiceCreateErrorDetails"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.validate-http-route-match",
      "title": "Reject HTTP gateway routes without hosts or paths",
      "title_zh": "Reject HTTP gateway routes without hosts or paths",
      "interface_type": "workflow",
      "interface": "api/controller/apigateway.Struct.CreateHTTPAPIRoute",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestHTTPRouteResourceNameValidatesMatch"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.gateway.validate-tcp-nodeport-route-name",
      "title": "Reject out-of-range TCP NodePorts parsed from route names",
      "title_zh": "Reject out-of-range TCP NodePorts parsed from route names",
      "interface_type": "package_function",
      "interface": "api/controller/apigateway.nodePortFromTCPRouteName",
      "code_paths": [
        "api/controller/apigateway/api_gateway_route.go"
      ],
      "tests": [
        {
          "path": "api/controller/apigateway/api_gateway_route_test.go",
          "selector": "TestNodePortFromTCPRouteNameValidatesRange"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.app-version-format",
      "title": "Format Helm application versions for history output",
      "title_zh": "\u4e3a Helm \u5386\u53f2\u8f93\u51fa\u683c\u5f0f\u5316\u5e94\u7528\u7248\u672c\u53f7",
      "interface_type": "workflow",
      "interface": "pkg/helm.formatAppVersion",
      "code_paths": [
        "pkg/helm/helm.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/helm_release_test.go",
          "selector": "TestGetReleaseHistory"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.chart-name-format",
      "title": "Format Helm chart names for history and summary output",
      "title_zh": "\u4e3a\u5386\u53f2\u548c\u6458\u8981\u8f93\u51fa\u683c\u5f0f\u5316 Helm chart \u540d\u79f0",
      "interface_type": "workflow",
      "interface": "pkg/helm.formatChartName",
      "code_paths": [
        "pkg/helm/helm.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/helm_release_test.go",
          "selector": "TestGetReleaseHistory"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.classify-resources",
      "title": "Classify helm release resources by kind",
      "title_zh": "\u6309\u8d44\u6e90\u7c7b\u578b\u5f52\u7c7b Helm \u53d1\u5e03\u8d44\u6e90",
      "interface_type": "workflow",
      "interface": "api/handler.splitHelmReleaseResources",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestSplitHelmReleaseResourcesClassifiesKinds"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.default-namespace",
      "title": "Derive default helm release namespace",
      "title_zh": "\u63a8\u5bfc Helm \u53d1\u5e03\u9ed8\u8ba4\u547d\u540d\u7a7a\u95f4",
      "interface_type": "workflow",
      "interface": "api/handler.helmReleaseNamespace",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestHelmReleaseNamespaceUsesTenantNamespaceWhenPresent"
        },
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestHelmReleaseNamespaceFallsBackToTenantUUID"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.detail-summary",
      "title": "Summarize helm release detail",
      "title_zh": "\u6c47\u603b Helm \u53d1\u5e03\u8be6\u60c5",
      "interface_type": "workflow",
      "interface": "api/handler.summarizeHelmReleaseDetail",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestSummarizeHelmReleaseDetailBuildsStableDTO"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.history-summary",
      "title": "Summarize Helm release history",
      "title_zh": "\u6c47\u603b Helm \u53d1\u5e03\u5386\u53f2",
      "interface_type": "handler_method",
      "interface": "api/handler.summarizeHelmReleaseHistory",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestSummarizeHelmReleaseHistoryBuildsStableDTO"
        },
        {
          "path": "pkg/helm/helm_release_test.go",
          "selector": "TestGetReleaseHistory"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.install-defaults",
      "title": "Normalize Helm install defaults",
      "title_zh": "\u89c4\u8303 Helm \u5b89\u88c5\u9ed8\u8ba4\u53c2\u6570",
      "interface_type": "handler_method",
      "interface": "api/handler.HelmReleaseInstallRequest.Normalize",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestHelmReleaseInstallRequestNormalizeDefaults"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.install-validate",
      "title": "Validate Helm install request",
      "title_zh": "\u6821\u9a8c Helm \u5b89\u88c5\u8bf7\u6c42",
      "interface_type": "handler_method",
      "interface": "api/handler.HelmReleaseInstallRequest.Validate",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestHelmReleaseInstallRequestValidate"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.installable-check",
      "title": "Reject non-installable Helm chart types",
      "title_zh": "\u62d2\u7edd\u4e0d\u53ef\u5b89\u88c5\u7684 Helm chart \u7c7b\u578b",
      "interface_type": "workflow",
      "interface": "pkg/helm.checkIfInstallable",
      "code_paths": [
        "pkg/helm/helm.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/helm_release_test.go",
          "selector": "TestCheckIfInstallable"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.list-summary",
      "title": "Summarize helm release list item",
      "title_zh": "\u6c47\u603b Helm \u53d1\u5e03\u5217\u8868\u9879",
      "interface_type": "workflow",
      "interface": "api/handler.summarizeHelmRelease",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestSummarizeHelmReleaseBuildsStableDTO"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.match-managed-resource",
      "title": "Match managed helm release resources",
      "title_zh": "\u8bc6\u522b Helm \u6258\u7ba1\u8d44\u6e90\u5f52\u5c5e",
      "interface_type": "workflow",
      "interface": "api/handler.isHelmReleaseResource",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestIsHelmReleaseResourceMatchesManagedByAndInstanceLabels"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.oci-reference-normalize",
      "title": "Normalize OCI chart references and derive version tags",
      "title_zh": "\u89c4\u8303\u5316 OCI chart \u5f15\u7528\u5e76\u63a8\u5bfc\u7248\u672c\u6807\u7b7e",
      "interface_type": "workflow",
      "interface": "pkg/helm.normalizeOCIChartReference",
      "code_paths": [
        "pkg/helm/helm.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/helm_release_test.go",
          "selector": "TestNormalizeOCIChartReference"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.preview-source-error",
      "title": "Convert helm preview source error to bad request",
      "title_zh": "\u5c06 Helm \u9884\u89c8\u6765\u6e90\u9519\u8bef\u8f6c\u6362\u4e3a\u9519\u8bef\u8bf7\u6c42",
      "interface_type": "workflow",
      "interface": "api/handler.wrapHelmChartPreviewSourceError",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestWrapHelmChartPreviewSourceErrorConvertsToBadRequest"
        },
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestWrapHelmChartPreviewSourceErrorPreservesBadRequest"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.resolve-namespace",
      "title": "Resolve Helm release namespace",
      "title_zh": "\u89e3\u6790 Helm \u53d1\u5e03\u547d\u540d\u7a7a\u95f4",
      "interface_type": "handler_method",
      "interface": "api/handler.HelmReleaseHandler.resolveNamespace",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestResolveHelmReleaseNamespaceUsesExplicitNamespace"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.resolve-namespace-fallback",
      "title": "Resolve helm namespace from tenant when request omits namespace",
      "title_zh": "\u8bf7\u6c42\u672a\u6307\u5b9a\u65f6\u4ece\u56e2\u961f\u63a8\u5bfc Helm \u547d\u540d\u7a7a\u95f4",
      "interface_type": "workflow",
      "interface": "api/handler.(*HelmReleaseHandler).resolveNamespace",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestResolveHelmReleaseNamespaceFallsBackToTenantNamespace"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.rollback-validate",
      "title": "Validate helm release rollback revision",
      "title_zh": "\u6821\u9a8c Helm \u56de\u6eda\u7248\u672c",
      "interface_type": "workflow",
      "interface": "api/handler.HelmReleaseRollbackRequest.Validate",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestHelmReleaseRollbackRequestValidate"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.strip-kube-version",
      "title": "Strip kubeVersion requirements from charts before install or load",
      "title_zh": "\u5728\u5b89\u88c5\u6216\u52a0\u8f7d\u524d\u79fb\u9664 chart \u7684 kubeVersion \u8981\u6c42",
      "interface_type": "workflow",
      "interface": "pkg/helm.removeKubeVersionFromChart",
      "code_paths": [
        "pkg/helm/helm.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/helm_release_test.go",
          "selector": "TestCheckIfInstallable"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.upgrade-chart-guard",
      "title": "Guard helm upgrade chart mismatch",
      "title_zh": "\u62e6\u622a Helm \u5347\u7ea7\u56fe\u8868\u4e0d\u5339\u914d",
      "interface_type": "workflow",
      "interface": "api/handler.validateUpgradeChartName",
      "code_paths": [
        "api/handler/helm_release.go"
      ],
      "tests": [
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestValidateUpgradeChartNameRejectsMismatchByDefault"
        },
        {
          "path": "api/handler/helm_release_test.go",
          "selector": "TestValidateUpgradeChartNameAllowsMismatchWithExplicitConfirmation"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-release.values-yaml",
      "title": "Parse Helm values YAML into installable values maps",
      "title_zh": "\u5c06 Helm values YAML \u89e3\u6790\u4e3a\u53ef\u5b89\u88c5\u7684 values \u6620\u5c04",
      "interface_type": "workflow",
      "interface": "pkg/helm.parseValuesYAML",
      "code_paths": [
        "pkg/helm/helm.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/helm_release_test.go",
          "selector": "TestParseValuesYAML"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-repo.add",
      "title": "Add helm repository",
      "title_zh": "\u6dfb\u52a0 Helm \u4ed3\u5e93",
      "interface_type": "workflow",
      "interface": "pkg/helm.Repo.Add",
      "code_paths": [
        "pkg/helm/repo.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/repo_test.go",
          "selector": "TestRepoAdd"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.helm-repo.add-idempotent",
      "title": "Skip Helm repo add when the same repo already exists",
      "title_zh": "\u5f53\u76f8\u540c Helm \u4ed3\u5e93\u5df2\u5b58\u5728\u65f6\u8df3\u8fc7\u91cd\u590d\u6dfb\u52a0",
      "interface_type": "workflow",
      "interface": "pkg/helm.Repo.Add",
      "code_paths": [
        "pkg/helm/repo.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/repo_test.go",
          "selector": "TestRepoAddSkipsExistingConfig"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-repo.reject-deprecated",
      "title": "Reject deprecated Helm repository endpoints",
      "title_zh": "\u62d2\u7edd\u5df2\u5e9f\u5f03\u7684 Helm \u4ed3\u5e93\u5730\u5740",
      "interface_type": "workflow",
      "interface": "pkg/helm.Repo.Add",
      "code_paths": [
        "pkg/helm/repo.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/repo_test.go",
          "selector": "TestRepoAddRejectsDeprecatedRepo"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.helm-repo.requested-filter",
      "title": "Validate and match requested Helm repository names",
      "title_zh": "\u6821\u9a8c\u5e76\u5339\u914d\u8bf7\u6c42\u66f4\u65b0\u7684 Helm \u4ed3\u5e93\u540d\u79f0",
      "interface_type": "workflow",
      "interface": "pkg/helm.checkRequestedRepos",
      "code_paths": [
        "pkg/helm/update.go"
      ],
      "tests": [
        {
          "path": "pkg/helm/helm_release_test.go",
          "selector": "TestCheckRequestedRepos"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.image-clean.registry-gc-noop",
      "title": "Skip registry garbage collect exec when no hub pod matches",
      "title_zh": "\u5f53\u6ca1\u6709\u5339\u914d\u7684\u4ed3\u5e93 Pod \u65f6\u8df3\u8fc7\u5783\u573e\u56de\u6536\u6267\u884c",
      "interface_type": "workflow",
      "interface": "builder/clean.Manager.PodExecCmd",
      "code_paths": [
        "builder/clean/clean.go"
      ],
      "tests": [
        {
          "path": "builder/clean/clean_test.go",
          "selector": "TestPodExecCmdNoMatchingPod"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.image-clean.stop-loop",
      "title": "Stop image clean manager by cancelling its loop context",
      "title_zh": "\u901a\u8fc7\u53d6\u6d88\u4e0a\u4e0b\u6587\u505c\u6b62\u955c\u50cf\u6e05\u7406\u7ba1\u7406\u5668\u5faa\u73af",
      "interface_type": "workflow",
      "interface": "builder/clean.Manager.Stop",
      "code_paths": [
        "builder/clean/clean.go"
      ],
      "tests": [
        {
          "path": "builder/clean/clean_test.go",
          "selector": "TestManagerStopCancelsContext"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.image-share.single-attempt",
      "title": "Run image share only once",
      "title_zh": "\u955c\u50cf\u5206\u4eab\u5931\u8d25\u540e\u4e0d\u81ea\u52a8\u91cd\u8bd5",
      "interface_type": "workflow",
      "interface": "builder/exector.imageShare",
      "code_paths": [
        "builder/exector/exector.go"
      ],
      "tests": [
        {
          "path": "builder/exector/share_image_test.go",
          "selector": "TestExecuteImageShareOnceDoesNotRetryFailure"
        },
        {
          "path": "builder/exector/share_image_test.go",
          "selector": "TestExecuteImageShareOnceReturnsSuccess"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.ingress-nginx.meta-namespace-key",
      "title": "Build meta namespace keys for ingress-nginx watched objects",
      "title_zh": "\u4e3a ingress-nginx \u76d1\u542c\u5bf9\u8c61\u6784\u5efa namespace/name \u952e",
      "interface_type": "workflow",
      "interface": "util/ingress-nginx/k8s.MetaNamespaceKey",
      "code_paths": [
        "util/ingress-nginx/k8s/main.go"
      ],
      "tests": [
        {
          "path": "util/ingress-nginx/k8s/main_test.go",
          "selector": "TestMetaNamespaceKey"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.ingress-nginx.name-namespace-parse",
      "title": "Parse namespace/name identifiers for ingress-nginx resources",
      "title_zh": "\u89e3\u6790 ingress-nginx \u8d44\u6e90\u7684 namespace/name \u6807\u8bc6",
      "interface_type": "workflow",
      "interface": "util/ingress-nginx/k8s.ParseNameNS",
      "code_paths": [
        "util/ingress-nginx/k8s/main.go"
      ],
      "tests": [
        {
          "path": "util/ingress-nginx/k8s/main_test.go",
          "selector": "TestParseNameNS"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.ingress-nginx.node-ip-resolve",
      "title": "Resolve node internal or external IPs for ingress-nginx helpers",
      "title_zh": "\u4e3a ingress-nginx helper \u89e3\u6790\u8282\u70b9\u5185\u5916\u7f51 IP",
      "interface_type": "workflow",
      "interface": "util/ingress-nginx/k8s.GetNodeIPOrName",
      "code_paths": [
        "util/ingress-nginx/k8s/main.go"
      ],
      "tests": [
        {
          "path": "util/ingress-nginx/k8s/main_test.go",
          "selector": "TestGetNodeIPOrName"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.ingress-nginx.pod-details",
      "title": "Resolve running ingress-nginx pod details from env and cluster state",
      "title_zh": "\u6839\u636e\u73af\u5883\u53d8\u91cf\u548c\u96c6\u7fa4\u72b6\u6001\u89e3\u6790 ingress-nginx Pod \u8be6\u60c5",
      "interface_type": "workflow",
      "interface": "util/ingress-nginx/k8s.GetPodDetails",
      "code_paths": [
        "util/ingress-nginx/k8s/main.go"
      ],
      "tests": [
        {
          "path": "util/ingress-nginx/k8s/main_test.go",
          "selector": "TestGetPodDetails"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.k8s-resource.crd-cascade-delete",
      "title": "CRD cascade deletion preserves dependency order",
      "title_zh": "CRD cascade deletion preserves dependency order",
      "interface_type": "handler_method",
      "interface": "api/handler.k8sResourceDeletionOrchestrator.Delete",
      "code_paths": [
        "api/handler/resource_deletion.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_deletion_test.go",
          "selector": "TestK8sResourceDeletionDeletesCustomResourcesBeforeDefinition"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.k8s-resource.deletion-request-timeout",
      "title": "Kubernetes deletion requests outlive the global HTTP timeout",
      "title_zh": "Kubernetes deletion requests outlive the global HTTP timeout",
      "interface_type": "workflow",
      "interface": "pkg/interceptors.requestTimeout",
      "code_paths": [
        "pkg/interceptors/http.go"
      ],
      "tests": [
        {
          "path": "pkg/interceptors/http_test.go",
          "selector": "TestRequestTimeout"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.k8s-resource.deletion-timeout-final-check",
      "title": "Kubernetes deletion timeout performs a final live check",
      "title_zh": "Kubernetes deletion timeout performs a final live check",
      "interface_type": "handler_method",
      "interface": "api/handler.k8sResourceDeletionOrchestrator.Delete",
      "code_paths": [
        "api/handler/resource_deletion.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_deletion_test.go",
          "selector": "TestK8sResourceDeletionFinalCheckAvoidsTimeoutRace"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.k8s-resource.failed-delete-metadata-only",
      "title": "Failed resources are metadata-only during deletion",
      "title_zh": "Failed resources are metadata-only during deletion",
      "interface_type": "handler_method",
      "interface": "api/handler.k8sResourceDeletionOrchestrator.Delete",
      "code_paths": [
        "api/handler/resource_deletion.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_deletion_test.go",
          "selector": "TestK8sResourceDeletionSkipsFailedResourceKubernetesDeletion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.k8s-resource.metadata-reconcile",
      "title": "Kubernetes resource metadata reconciliation",
      "title_zh": "Kubernetes resource metadata reconciliation",
      "interface_type": "handler_method",
      "interface": "api/handler.k8sResourceDeletionOrchestrator.Reconcile",
      "code_paths": [
        "api/handler/resource_deletion.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_deletion_test.go",
          "selector": "TestK8sResourceReconcileDistinguishesMissingAndUnknown"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.k8s-resource.response-array-contract",
      "title": "Resource deletion and reconciliation responses encode empty lists as arrays",
      "title_zh": "Resource deletion and reconciliation responses encode empty lists as arrays",
      "interface_type": "workflow",
      "interface": "k8sResourceDeletionOrchestrator",
      "code_paths": [
        "api/handler/resource_deletion.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_deletion_test.go",
          "selector": "TestK8sResourceDeletionResponseArrays"
        },
        {
          "path": "api/handler/resource_deletion_test.go",
          "selector": "TestK8sResourceReconcileResponseArrays"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.k8s-resource.stop-recreating-controller",
      "title": "Stop in-application controllers before deleting generated custom resources",
      "title_zh": "Stop in-application controllers before deleting generated custom resources",
      "interface_type": "handler_method",
      "interface": "api/handler.k8sResourceDeletionOrchestrator.Delete",
      "code_paths": [
        "api/handler/resource_deletion.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_deletion_test.go",
          "selector": "TestK8sResourceDeletionStopsManagedControllerBeforeGeneratedResources"
        },
        {
          "path": "api/handler/resource_deletion_test.go",
          "selector": "TestK8sResourceDeletionKeepsControllerUntilFinalizedResourcesAreGone"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.k8s.scheme-registers-kubevirt-vm",
      "title": "K8s scheme registers KubeVirt VirtualMachine",
      "title_zh": "K8s scheme registers KubeVirt VirtualMachine",
      "interface_type": "package_function",
      "interface": "pkg/component/k8s.init",
      "code_paths": [
        "pkg/component/k8s/k8sComponent.go"
      ],
      "tests": [
        {
          "path": "pkg/component/k8s/k8sComponent_test.go",
          "selector": "TestSchemeRegistersKubeVirtVirtualMachine"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.kubeblocks.component-selector",
      "title": "Generate label selectors for KubeBlocks components",
      "title_zh": "\u4e3a KubeBlocks \u7ec4\u4ef6\u751f\u6210\u6807\u7b7e\u9009\u62e9\u5668",
      "interface_type": "workflow",
      "interface": "util/kubeblocks.GenerateKubeBlocksSelector",
      "code_paths": [
        "util/kubeblocks/kubeblocks.go"
      ],
      "tests": [
        {
          "path": "util/kubeblocks/kubeblocks_test.go",
          "selector": "TestGenerateKubeBlocksSelector"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.license.decode",
      "title": "Decode and parse license token payload",
      "title_zh": "\u89e3\u7801\u5e76\u89e3\u6790\u8bb8\u53ef\u8bc1\u4ee4\u724c\u5185\u5bb9",
      "interface_type": "workflow",
      "interface": "api/util/license.DecodeLicense",
      "code_paths": [
        "api/util/license/rsa_license.go"
      ],
      "tests": [
        {
          "path": "api/util/license/rsa_license_test.go",
          "selector": "TestDecodeLicense"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.license.parse-public-key",
      "title": "Parse PEM encoded RSA public keys",
      "title_zh": "\u89e3\u6790 PEM \u7f16\u7801\u7684 RSA \u516c\u94a5",
      "interface_type": "workflow",
      "interface": "api/util/license.ParsePublicKey",
      "code_paths": [
        "api/util/license/rsa_license.go"
      ],
      "tests": [
        {
          "path": "api/util/license/rsa_license_test.go",
          "selector": "TestParsePublicKey"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.license.plugin-allowlist",
      "title": "Decide whether a plugin is allowed by license mapping",
      "title_zh": "\u6839\u636e\u8bb8\u53ef\u8bc1\u6620\u5c04\u5224\u65ad\u63d2\u4ef6\u662f\u5426\u5141\u8bb8\u4f7f\u7528",
      "interface_type": "workflow",
      "interface": "api/util/license.IsPluginAllowed",
      "code_paths": [
        "api/util/license/rsa_license.go"
      ],
      "tests": [
        {
          "path": "api/util/license/rsa_license_test.go",
          "selector": "TestIsPluginAllowed_Wildcard"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.license.round-trip",
      "title": "Round-trip encode decode and validate license token",
      "title_zh": "\u5f80\u8fd4\u7f16\u7801\u89e3\u7801\u5e76\u6821\u9a8c\u8bb8\u53ef\u8bc1\u4ee4\u724c",
      "interface_type": "workflow",
      "interface": "api/util/license.EncodeLicense",
      "code_paths": [
        "api/util/license/rsa_license.go"
      ],
      "tests": [
        {
          "path": "api/util/license/rsa_license_test.go",
          "selector": "TestRoundTrip"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.license.status-projection",
      "title": "Project license tokens into status responses",
      "title_zh": "\u5c06\u8bb8\u53ef\u8bc1\u4ee4\u724c\u6295\u5f71\u4e3a\u72b6\u6001\u54cd\u5e94",
      "interface_type": "workflow",
      "interface": "api/util/license.TokenToStatus",
      "code_paths": [
        "api/util/license/rsa_license.go"
      ],
      "tests": [
        {
          "path": "api/util/license/rsa_license_test.go",
          "selector": "TestTokenToStatus"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.license.validate-token",
      "title": "Validate license enterprise binding and validity window",
      "title_zh": "\u6821\u9a8c\u8bb8\u53ef\u8bc1\u4f01\u4e1a\u7ed1\u5b9a\u4e0e\u751f\u6548\u65f6\u95f4\u7a97\u53e3",
      "interface_type": "workflow",
      "interface": "api/util/license.ValidateToken",
      "code_paths": [
        "api/util/license/rsa_license.go"
      ],
      "tests": [
        {
          "path": "api/util/license/rsa_license_test.go",
          "selector": "TestValidateToken_Valid"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.license.verify-signature",
      "title": "Verify RSA license signatures",
      "title_zh": "\u6821\u9a8c\u8bb8\u53ef\u8bc1 RSA \u7b7e\u540d",
      "interface_type": "workflow",
      "interface": "api/util/license.VerifySignature",
      "code_paths": [
        "api/util/license/rsa_license.go"
      ],
      "tests": [
        {
          "path": "api/util/license/rsa_license_test.go",
          "selector": "TestVerifySignature_Valid"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.lifecycle.service-reconcile-preserves-identity",
      "title": "Service reconciliation preserves allocated Kubernetes identity",
      "title_zh": "Service reconciliation preserves allocated Kubernetes identity",
      "interface_type": "package_function",
      "interface": "worker/appm/controller.CreateKubeService",
      "code_paths": [
        "worker/appm/controller/kube-controller.go"
      ],
      "tests": [
        {
          "path": "worker/appm/controller/kube-controller_test.go",
          "selector": "TestCreateKubeServiceReconcilesOwnedServiceAndPreservesIdentity"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.lifecycle.service-reconcile-rejects-foreign-owner",
      "title": "Service reconciliation rejects foreign ownership",
      "title_zh": "Service reconciliation rejects foreign ownership",
      "interface_type": "package_function",
      "interface": "worker/appm/controller.CreateKubeService",
      "code_paths": [
        "worker/appm/controller/kube-controller.go"
      ],
      "tests": [
        {
          "path": "worker/appm/controller/kube-controller_test.go",
          "selector": "TestCreateKubeServiceRejectsForeignService"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.lifecycle.stop-preserves-service",
      "title": "Stopping a component preserves its generated Service identity",
      "title_zh": "Stopping a component preserves its generated Service identity",
      "interface_type": "workflow",
      "interface": "worker/appm/controller.stopController.stopOne",
      "code_paths": [
        "worker/appm/controller/stop.go"
      ],
      "tests": [
        {
          "path": "worker/appm/controller/stop_test.go",
          "selector": "TestStopPreservesGeneratedService"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.lifecycle.stop-suppresses-exit-event",
      "title": "Suppress container exit events during intentional stop",
      "title_zh": "Suppress container exit events during intentional stop",
      "interface_type": "package_function",
      "interface": "worker/master/podevent.shouldReportContainerExit",
      "code_paths": [
        "worker/master/podevent/podevent.go"
      ],
      "tests": [
        {
          "path": "worker/master/podevent/health_event_test.go",
          "selector": "TestShouldReportContainerExit"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.manual-pvc-upgrade-delete-idempotent",
      "title": "Manual PVC cleanup tolerates absent claims and preserves deletion errors",
      "title_zh": "Manual PVC cleanup tolerates absent claims and preserves deletion errors",
      "interface_type": "workflow",
      "interface": "upgradeController.upgradeManualClaims",
      "code_paths": [
        "worker/appm/f/function.go",
        "worker/appm/controller/upgrade.go"
      ],
      "tests": [
        {
          "path": "worker/appm/controller/upgrade_manual_claim_test.go",
          "selector": "TestUpgradeControllerUpgradeManualClaimsDeletesStaleClaims"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.manual-pvc-upgrade-preserves-bound-claim-immutable-spec",
      "title": "Preserve bound manual PVC immutable spec fields during app upgrade",
      "interface_type": "workflow",
      "interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
      "code_paths": [
        "worker/appm/controller/upgrade.go",
        "worker/appm/f/function.go"
      ],
      "tests": [
        {
          "path": "worker/appm/controller/upgrade_manual_claim_test.go",
          "selector": "TestUpgradeControllerUpgradeManualClaimsPreservesBoundClaimImmutableSpec"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.manual-pvc-upgrade-preserves-existing-metadata",
      "title": "Preserve existing manual PVC metadata during app upgrade",
      "interface_type": "workflow",
      "interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
      "code_paths": [
        "worker/appm/f/function.go"
      ],
      "tests": [
        {
          "path": "worker/appm/controller/upgrade_manual_claim_test.go",
          "selector": "TestUpgradeControllerUpgradeManualClaimsPreservesExistingMetadata"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.manual-pvc-upgrade-skips-unchanged-storage",
      "title": "Skip manual PVC updates when storage request is unchanged",
      "interface_type": "workflow",
      "interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
      "code_paths": [
        "worker/appm/f/function.go"
      ],
      "tests": [
        {
          "path": "worker/appm/controller/upgrade_manual_claim_test.go",
          "selector": "TestUpgradeControllerUpgradeManualClaimsSkipsUnchangedStorage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.manual-pvc-upgrade-surfaces-update-errors",
      "title": "Surface manual PVC update errors during app upgrade",
      "title_zh": "\u5e94\u7528\u5347\u7ea7\u65f6\u8fd4\u56de\u624b\u52a8 PVC \u66f4\u65b0\u9519\u8bef",
      "interface_type": "workflow",
      "interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
      "code_paths": [
        "worker/appm/controller/upgrade.go"
      ],
      "tests": [
        {
          "path": "worker/appm/controller/upgrade_manual_claim_test.go",
          "selector": "TestUpgradeControllerUpgradeManualClaimsReturnsUpdateError"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.manual-pvc-upgrade-updates-existing-claim",
      "title": "Update existing manual PVCs during app upgrade",
      "title_zh": "\u5e94\u7528\u5347\u7ea7\u65f6\u66f4\u65b0\u5df2\u6709\u624b\u52a8 PVC",
      "interface_type": "workflow",
      "interface": "worker/appm/controller.upgradeController.upgradeManualClaims",
      "code_paths": [
        "worker/appm/controller/upgrade.go"
      ],
      "tests": [
        {
          "path": "worker/appm/controller/upgrade_manual_claim_test.go",
          "selector": "TestUpgradeControllerUpgradeManualClaimsUpdatesExistingClaim"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.maven.list-modules",
      "title": "List Maven modules for multi-service build",
      "title_zh": "\u5217\u51fa Maven \u591a\u670d\u52a1\u6a21\u5757",
      "interface_type": "workflow",
      "interface": "builder/parser/code/multisvc.maven.ListModules",
      "code_paths": [
        "builder/parser/code/multisvc/maven.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/multisvc/maven_test.go",
          "selector": "TestMaven_ListModules"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.maven.parse-pom",
      "title": "Parse Maven parent pom for modules and packaging",
      "title_zh": "\u89e3\u6790 Maven \u7236 pom \u7684\u6a21\u5757\u4e0e\u6253\u5305\u65b9\u5f0f",
      "interface_type": "workflow",
      "interface": "builder/parser/code/multisvc.parsePom",
      "code_paths": [
        "builder/parser/code/multisvc/maven.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/multisvc/maven_test.go",
          "selector": "TestMaven_ParsePom"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.mq.cancelable-dequeue",
      "title": "Cancelable MQ dequeues preserve queued messages",
      "title_zh": "\u6d88\u606f\u961f\u5217\u51fa\u961f\u54cd\u5e94\u53d6\u6d88\u5e76\u4fdd\u7559\u5f85\u5904\u7406\u6d88\u606f",
      "interface_type": "workflow",
      "interface": "mq/api/mq.etcdQueue.Dequeue",
      "code_paths": [
        "mq/api/mq/mq.go",
        "mq/api/mq/store.go"
      ],
      "tests": [
        {
          "path": "mq/api/mq/store_test.go",
          "selector": "TestDequeueCanceledRequestPreservesQueuedMessage"
        },
        {
          "path": "mq/api/mq/store_test.go",
          "selector": "TestDequeueHonorsCallerDeadline"
        },
        {
          "path": "mq/api/mq/store_test.go",
          "selector": "TestCanceledDequeueDoesNotConsumeLaterMessage"
        },
        {
          "path": "mq/api/mq/store_test.go",
          "selector": "TestDequeueWaitsForMessagesInFIFOOrder"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.multisvc.ignore-non-java",
      "title": "Ignore non-Java languages in multi-service parser selection",
      "title_zh": "\u5728\u591a\u670d\u52a1\u89e3\u6790\u5668\u9009\u62e9\u4e2d\u5ffd\u7565\u975e Java \u8bed\u8a00",
      "interface_type": "workflow",
      "interface": "builder/parser/code/multisvc.NewMultiServiceI",
      "code_paths": [
        "builder/parser/code/multisvc/multi_services.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/multisvc/multi_services_test.go",
          "selector": "TestNewMultiServiceI_IgnoresLanguagesWithoutJavaMaven"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.multisvc.select-java-maven",
      "title": "Select Java Maven multi-service parser for composite language",
      "title_zh": "\u4e3a\u590d\u5408\u8bed\u8a00\u9009\u62e9 Java Maven \u591a\u670d\u52a1\u89e3\u6790\u5668",
      "interface_type": "workflow",
      "interface": "builder/parser/code/multisvc.NewMultiServiceI",
      "code_paths": [
        "builder/parser/code/multisvc/multi_services.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/multisvc/multi_services_test.go",
          "selector": "TestNewMultiServiceI_SupportsCompositeJavaMaven"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.node-version.display-info",
      "title": "Summarize node version display and derived metadata",
      "title_zh": "\u6c47\u603b Node \u7248\u672c\u5c55\u793a\u4e0e\u6d3e\u751f\u4fe1\u606f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.NodeVersionInfo helpers",
      "code_paths": [
        "builder/parser/code/node_version.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestCleanVersionSpec"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestExtractMajorVersion"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestExtractMinorPatch"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestNodeVersionInfo_IsLTS"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestNodeVersionInfo_GetNodeVersionDisplay"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.node-version.fallback-supported-range",
      "title": "Fallback unsupported Node.js versions into supported range",
      "title_zh": "\u5c06\u4e0d\u53d7\u652f\u6301\u7684 Node.js \u7248\u672c\u56de\u9000\u5230\u652f\u6301\u8303\u56f4",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ResolveNodeVersion",
      "code_paths": [
        "builder/parser/code/node_version.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_UnsupportedVersion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.node-version.normalize-v-prefix",
      "title": "Normalize v-prefixed Node.js version",
      "title_zh": "\u89c4\u8303\u5316\u5e26 v \u524d\u7f00\u7684 Node.js \u7248\u672c",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ResolveNodeVersion",
      "code_paths": [
        "builder/parser/code/node_version.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_WithVPrefix"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.node-version.parse-package-json",
      "title": "Parse node version requirements from package.json",
      "title_zh": "\u4ece package.json \u89e3\u6790 Node \u7248\u672c\u8981\u6c42",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ParseNodeVersionFromPackageJSON",
      "code_paths": [
        "builder/parser/code/node_version.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestParseNodeVersionFromPackageJSON"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestParseNodeVersionFromPackageJSON_NoEngines"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestParseNodeVersionFromPackageJSON_NoPackageJSON"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.node-version.resolve-range",
      "title": "Resolve ranged Node.js version constraint",
      "title_zh": "\u89e3\u6790\u8303\u56f4\u5f62\u5f0f\u7684 Node.js \u7248\u672c\u7ea6\u675f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ResolveNodeVersion",
      "code_paths": [
        "builder/parser/code/node_version.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_Range"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.node-version.resolve-spec",
      "title": "Resolve node version spec into supported runtime line",
      "title_zh": "\u5c06 Node \u7248\u672c\u8868\u8fbe\u5f0f\u89e3\u6790\u4e3a\u652f\u6301\u7684\u8fd0\u884c\u65f6\u7248\u672c",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ResolveNodeVersion",
      "code_paths": [
        "builder/parser/code/node_version.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_Empty"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_Wildcard"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_GreaterThanOrEqual"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_Caret"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_Tilde"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_XNotation"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_MajorOnly"
        },
        {
          "path": "builder/parser/code/node_version_test.go",
          "selector": "TestResolveNodeVersion_ExactVersion"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.ns-resource.batch-create",
      "title": "Create namespace resources from multi-document YAML",
      "title_zh": "\u6279\u91cf\u521b\u5efa\u547d\u540d\u7a7a\u95f4\u8d44\u6e90",
      "interface_type": "handler_method",
      "interface": "api/handler.NsResourceHandler.CreateNsResource",
      "code_paths": [
        "api/handler/ns_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/ns_resource_test.go",
          "selector": "TestCreateNsResourceBatchAggregatesPartialSuccess"
        },
        {
          "path": "api/handler/ns_resource_test.go",
          "selector": "TestCreateNsResourceBatchPreservesExplicitNamespace"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.ns-resource.detect-source",
      "title": "Detect namespace resource source",
      "title_zh": "\u8bc6\u522b\u547d\u540d\u7a7a\u95f4\u8d44\u6e90\u6765\u6e90",
      "interface_type": "workflow",
      "interface": "api/handler.detectResourceSource",
      "code_paths": [
        "api/handler/ns_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/ns_resource_test.go",
          "selector": "TestDetectResourceSource"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.ns-resource.handler-singleton",
      "title": "Reuse singleton namespace resource handler",
      "title_zh": "\u590d\u7528\u547d\u540d\u7a7a\u95f4\u8d44\u6e90\u5904\u7406\u5668\u5355\u4f8b",
      "interface_type": "workflow",
      "interface": "api/handler.GetNsResourceHandler",
      "code_paths": [
        "api/handler/ns_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/ns_resource_test.go",
          "selector": "TestGetNsResourceHandlerSingleton"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.ns-resource.ingress-summary",
      "title": "Summarize ingress routing metadata for namespace resources",
      "title_zh": "\u6c47\u603b Ingress \u8d44\u6e90\u8def\u7531\u5143\u6570\u636e",
      "interface_type": "workflow",
      "interface": "api/handler.toNsResourceInfo",
      "code_paths": [
        "api/handler/ns_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/ns_resource_test.go",
          "selector": "TestToNsResourceInfoIncludesIngressSummary"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.ns-resource.mark-source",
      "title": "Mark namespace resource source labels",
      "title_zh": "\u6807\u8bb0\u547d\u540d\u7a7a\u95f4\u8d44\u6e90\u6765\u6e90",
      "interface_type": "workflow",
      "interface": "api/handler.injectSourceLabel",
      "code_paths": [
        "api/handler/ns_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/ns_resource_test.go",
          "selector": "TestInjectSourceLabelYaml"
        },
        {
          "path": "api/handler/ns_resource_test.go",
          "selector": "TestInjectSourceLabelManual"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.ns-resource.resolve-tenant-namespace",
      "title": "Resolve tenant namespace for namespaced resource operations",
      "title_zh": "\u89e3\u6790\u56e2\u961f\u547d\u540d\u7a7a\u95f4",
      "interface_type": "workflow",
      "interface": "api/handler.(*NsResourceHandler).getTenantNamespace",
      "code_paths": [
        "api/handler/ns_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/ns_resource_test.go",
          "selector": "TestGetTenantNamespaceUsesNamespaceField"
        },
        {
          "path": "api/handler/ns_resource_test.go",
          "selector": "TestGetTenantNamespaceFallsBackToUUIDWhenNamespaceEmpty"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.overview.disk-availability",
      "title": "Distinguish missing node filesystem measurements",
      "title_zh": "Distinguish missing node filesystem measurements",
      "interface_type": "handler_method",
      "interface": "nodesHandle.ListNodes",
      "code_paths": [
        "api/handler/nodes.go",
        "api/handler/node_filesystem_stats.go",
        "api/model/nodes.go"
      ],
      "tests": [
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewDiskStatsAvailability"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.overview.empty-installed-plugins",
      "title": "Empty installed plugin results encode as an array",
      "title_zh": "Empty installed plugin results encode as an array",
      "interface_type": "handler_method",
      "interface": "clusterAction.ListPlugins",
      "code_paths": [
        "api/handler/cluster.go"
      ],
      "tests": [
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewEmptyInstalledPluginsAreAnArray"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.overview.kubernetes-cluster-resources",
      "title": "Read truthful bounded Kubernetes workload resource snapshots",
      "title_zh": "Read truthful bounded Kubernetes workload resource snapshots",
      "interface_type": "handler_method",
      "interface": "clusterAction.GetClusterInfo",
      "code_paths": [
        "api/handler/cluster.go",
        "api/handler/cluster_overview_resources.go",
        "api/handler/tenant.go",
        "api/model/cluster.go"
      ],
      "tests": [
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewClusterResourcesUseKubernetesNotPrometheus"
        },
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewClusterResourcesReportZeroOnlyAfterSuccessfulReads"
        },
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewClusterResourcesCoalesceConcurrentRefresh"
        },
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewClusterResourceRequestsIncludeInitSidecarsAndOverhead"
        },
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewClusterResourcesPreserveFractionalCapacityAndScheduledScope"
        },
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewClusterResourcesIncludeEmptySchedulableNodes"
        },
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewClusterResourceRefreshWaitRespectsCancellation"
        },
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewClusterResourceOptionalVersionCannotBlockResources"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.overview.lightweight-nodes",
      "title": "Lightweight node health skips optional statistics",
      "title_zh": "Lightweight node health skips optional statistics",
      "interface_type": "handler_method",
      "interface": "nodesHandle.ListNodesWithOptions",
      "code_paths": [
        "api/handler/nodes.go",
        "api/model/nodes.go"
      ],
      "tests": [
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewLightweightNodesSkipStats"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.overview.nodes-request-context",
      "title": "Preserve node request context and optional statistics default",
      "title_zh": "Preserve node request context and optional statistics default",
      "interface_type": "view_endpoint",
      "interface": "GET /v2/nodes",
      "code_paths": [
        "api/controller/nodes.go"
      ],
      "tests": [
        {
          "path": "api/controller/overview_nodes_test.go",
          "selector": "TestOverviewNodesRequestPreservesContextAndDefaults"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.overview.nonblocking-local-disk",
      "title": "Optional local disk sampling never blocks cluster resources",
      "title_zh": "Optional local disk sampling never blocks cluster resources",
      "interface_type": "workflow",
      "interface": "clusterAction.withLocalDiskStats",
      "code_paths": [
        "api/handler/cluster.go",
        "api/handler/cluster_overview_resources.go",
        "api/model/cluster.go"
      ],
      "tests": [
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewClusterResourceCannotBeBlockedByLocalDisk"
        },
        {
          "path": "api/handler/overview_truthful_data_test.go",
          "selector": "TestOverviewLocalDiskFailureUsesCooldownAndPreservesStaleSample"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-build.clean-extracted-content",
      "title": "Clean stale extracted package content before unpacking",
      "title_zh": "\u89e3\u538b\u524d\u6e05\u7406\u65e7\u5305\u5c55\u5f00\u5185\u5bb9",
      "interface_type": "package_function",
      "interface": "builder/parser.cleanPackageExtractDir",
      "code_paths": [
        "builder/parser/source_code.go"
      ],
      "tests": [
        {
          "path": "builder/parser/package_archive_test.go",
          "selector": "TestCleanPackageExtractDirKeepsSelectedArchiveOnly"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-build.select-archive-over-extracted-content",
      "title": "Select uploaded package archive over extracted content",
      "title_zh": "\u4f18\u5148\u9009\u62e9\u4e0a\u4f20\u538b\u7f29\u5305\u800c\u4e0d\u662f\u65e7\u89e3\u538b\u5185\u5bb9",
      "interface_type": "package_function",
      "interface": "builder/parser.selectPackageArchive",
      "code_paths": [
        "builder/parser/source_code.go"
      ],
      "tests": [
        {
          "path": "builder/parser/package_archive_test.go",
          "selector": "TestSelectPackageArchiveSkipsExtractedDirectories"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-build.select-latest-archive",
      "title": "Select latest uploaded package archive",
      "title_zh": "\u4e8c\u6b21\u4e0a\u4f20\u65f6\u9009\u62e9\u6700\u65b0\u538b\u7f29\u5305",
      "interface_type": "package_function",
      "interface": "builder/parser.selectPackageArchive",
      "code_paths": [
        "builder/parser/source_code.go"
      ],
      "tests": [
        {
          "path": "builder/parser/package_archive_test.go",
          "selector": "TestSelectPackageArchiveUsesLatestArchiveForSecondUpload"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-manager.commands",
      "title": "Generate install/build/start commands from package manager",
      "title_zh": "\u6309\u5305\u7ba1\u7406\u5668\u751f\u6210\u5b89\u88c5\u6784\u5efa\u542f\u52a8\u547d\u4ee4",
      "interface_type": "workflow",
      "interface": "builder/parser/code.PackageManagerInfo",
      "code_paths": [
        "builder/parser/code/package_manager.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestPackageManagerInfo_GetCommands"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-manager.default-npm",
      "title": "Default to npm when no package manager lockfiles exist",
      "title_zh": "\u65e0\u9501\u6587\u4ef6\u65f6\u9ed8\u8ba4\u4f7f\u7528 npm",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectPackageManager",
      "code_paths": [
        "builder/parser/code/package_manager.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestDetectPackageManager_Default"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-manager.detect-lockfile",
      "title": "Detect package manager from lock files",
      "title_zh": "\u901a\u8fc7\u9501\u6587\u4ef6\u8bc6\u522b\u5305\u7ba1\u7406\u5668",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectPackageManager",
      "code_paths": [
        "builder/parser/code/package_manager.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestDetectPackageManager_PNPM"
        },
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestDetectPackageManager_Yarn"
        },
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestDetectPackageManager_NPM"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-manager.package-json-field",
      "title": "Detect package manager from package.json field",
      "title_zh": "\u901a\u8fc7 package.json \u5b57\u6bb5\u8bc6\u522b\u5305\u7ba1\u7406\u5668",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectPackageManager",
      "code_paths": [
        "builder/parser/code/package_manager.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestDetectPackageManager_PackageManagerField"
        },
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestDetectPackageManager_PackageManagerFieldYarn"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-manager.parse-package-manager-field",
      "title": "Parse packageManager field syntax",
      "title_zh": "\u89e3\u6790 packageManager \u5b57\u6bb5\u8bed\u6cd5",
      "interface_type": "workflow",
      "interface": "builder/parser/code.parsePackageManagerField",
      "code_paths": [
        "builder/parser/code/package_manager.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestParsePackageManagerField"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-manager.priority",
      "title": "Prefer higher-priority package manager when multiple lock files exist",
      "title_zh": "\u591a\u9501\u6587\u4ef6\u573a\u666f\u4e0b\u6309\u4f18\u5148\u7ea7\u8bc6\u522b\u5305\u7ba1\u7406\u5668",
      "interface_type": "workflow",
      "interface": "builder/parser/code.DetectPackageManager",
      "code_paths": [
        "builder/parser/code/package_manager.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestDetectPackageManager_Priority"
        },
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestDetectPackageManager_YarnOverNPM"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.package-manager.stringer",
      "title": "Render package manager enum as string",
      "title_zh": "\u5c06\u5305\u7ba1\u7406\u5668\u679a\u4e3e\u6e32\u67d3\u4e3a\u5b57\u7b26\u4e32",
      "interface_type": "workflow",
      "interface": "builder/parser/code.PackageManager.String",
      "code_paths": [
        "builder/parser/code/package_manager.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/package_manager_test.go",
          "selector": "TestPackageManager_String"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.plugin-build.detect-dockerfile",
      "title": "Detect whether plugin source contains a Dockerfile",
      "title_zh": "\u68c0\u6d4b\u63d2\u4ef6\u6e90\u7801\u76ee\u5f55\u4e2d\u662f\u5426\u5b58\u5728 Dockerfile",
      "interface_type": "workflow",
      "interface": "builder/exector.checkDockerfile",
      "code_paths": [
        "builder/exector/plugin_dockerfile.go"
      ],
      "tests": [
        {
          "path": "builder/exector/plugin_dockerfile_test.go",
          "selector": "TestCheckDockerfile"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.plugin-build.image-input-validate",
      "title": "Reject empty or invalid plugin image references before build",
      "title_zh": "\u5728\u63d2\u4ef6\u955c\u50cf\u6784\u5efa\u524d\u62d2\u7edd\u7a7a\u503c\u6216\u975e\u6cd5\u955c\u50cf\u5f15\u7528",
      "interface_type": "workflow",
      "interface": "builder/exector.exectorManager.run",
      "code_paths": [
        "builder/exector/plugin_image.go"
      ],
      "tests": [
        {
          "path": "builder/exector/plugin_image_test.go",
          "selector": "TestPluginImageRunRejectsEmptyImageURL"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.plugin-build.image-tag",
      "title": "Derive plugin image tags from source image names and versions",
      "title_zh": "\u6839\u636e\u6e90\u955c\u50cf\u540d\u548c\u7248\u672c\u751f\u6210\u63d2\u4ef6\u955c\u50cf\u6807\u7b7e",
      "interface_type": "workflow",
      "interface": "builder/exector.createPluginImageTag",
      "code_paths": [
        "builder/exector/plugin_image.go"
      ],
      "tests": [
        {
          "path": "builder/exector/plugin_image_test.go",
          "selector": "TestCreatePluginImageTag"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.plugin-dockerfile-build.default-arch-affinity",
      "title": "Default plugin Dockerfile build arch affinity",
      "title_zh": "Default plugin Dockerfile build arch affinity",
      "interface_type": "workflow",
      "interface": "builder/sources.newBuildKitPodSpec",
      "code_paths": [
        "builder/sources/image.go",
        "builder/exector/plugin_dockerfile.go",
        "api/handler/plugin.go",
        "api/model/pluginModel.go"
      ],
      "tests": [
        {
          "path": "builder/sources/image_test.go",
          "selector": "TestNewBuildKitPodSpecDefaultsMissingArchToRuntime"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.rainbondfile.missing",
      "title": "Return not found when rainbondfile is missing",
      "title_zh": "\u7f3a\u5c11 rainbondfile \u65f6\u8fd4\u56de\u672a\u627e\u5230",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ReadRainbondFile",
      "code_paths": [
        "builder/parser/code/rainbondfile.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/rainbondfile_test.go",
          "selector": "TestReadRainbondFile_ReturnsNotFoundWhenMissing"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.rainbondfile.parse",
      "title": "Parse rainbondfile yaml configuration",
      "title_zh": "\u89e3\u6790 rainbondfile YAML \u914d\u7f6e",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ReadRainbondFile",
      "code_paths": [
        "builder/parser/code/rainbondfile.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/rainbondfile_test.go",
          "selector": "TestReadRainbondFile_ParsesYamlConfig"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.rainbondfile.read-project-root",
      "title": "Read rainbondfile from project root",
      "title_zh": "\u4ece\u9879\u76ee\u6839\u76ee\u5f55\u8bfb\u53d6 rainbondfile",
      "interface_type": "workflow",
      "interface": "builder/parser/code.ReadRainbondFile",
      "code_paths": [
        "builder/parser/code/rainbondfile.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/rainbondfile_test.go",
          "selector": "TestReadRainbondFile"
        }
      ],
      "test_type": "unit",
      "status": "active"
    },
    {
      "id": "rainbond.region-api.configured-token-only",
      "title": "Only configured region token is accepted",
      "title_zh": "\u4ec5\u63a5\u53d7\u914d\u7f6e\u7684\u96c6\u7fa4 Token",
      "interface_type": "package_function",
      "interface": "api/middleware.FullToken",
      "code_paths": [
        "api/middleware/token.go"
      ],
      "tests": [
        {
          "path": "api/middleware/token_test.go",
          "selector": "TestFullTokenAllowsOnlyConfiguredRegionToken"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.registry.delete-vm-image-manifest",
      "title": "Delete internal VM image manifest from registry",
      "title_zh": "Delete internal VM image manifest from registry",
      "interface_type": "handler_method",
      "interface": "api/handler.ServiceAction.DeleteRegistryImageManifest",
      "code_paths": [
        "api/handler/registry_image.go",
        "api/controller/registry_image.go",
        "api/api_routers/version2/v2Routers.go"
      ],
      "tests": [
        {
          "path": "api/handler/registry_image_test.go",
          "selector": "TestDeleteRegistryImageManifestDeletesInternalVMImage"
        },
        {
          "path": "api/handler/registry_image_test.go",
          "selector": "TestDeleteRegistryImageManifestRejectsExternalRegistry"
        },
        {
          "path": "api/handler/registry_image_test.go",
          "selector": "TestDeleteRegistryImageManifestTreatsMissingManifestAsDeleted"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.registry.manifest-exists-oci",
      "title": "Resolve OCI image manifests during backup checks",
      "title_zh": "\u5907\u4efd\u6821\u9a8c\u652f\u6301 OCI \u955c\u50cf\u6e05\u5355",
      "interface_type": "workflow",
      "interface": "builder/sources/registry.Registry.ManifestExists",
      "code_paths": [
        "builder/sources/registry/manifest.go"
      ],
      "tests": [
        {
          "path": "builder/sources/registry/manifest_test.go",
          "selector": "TestManifestExistsAcceptsOCIManifestTypes"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.resource-center.collect-ingress-services",
      "title": "Collect ingress backend service names",
      "title_zh": "\u6536\u96c6 Ingress \u540e\u7aef\u670d\u52a1\u540d",
      "interface_type": "workflow",
      "interface": "api/handler.collectIngressServiceNames",
      "code_paths": [
        "api/handler/resource_center.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_center_test.go",
          "selector": "TestCollectIngressServiceNames"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.resource-center.event-summary",
      "title": "Summarize resource event info",
      "title_zh": "\u6c47\u603b\u8d44\u6e90\u4e8b\u4ef6\u4fe1\u606f",
      "interface_type": "workflow",
      "interface": "api/handler.toResourceEventInfo",
      "code_paths": [
        "api/handler/resource_center.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_center_test.go",
          "selector": "TestToResourceEventInfo"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.resource-center.match-selector",
      "title": "Match resource labels against selector",
      "title_zh": "\u6309\u9009\u62e9\u5668\u5339\u914d\u8d44\u6e90\u6807\u7b7e",
      "interface_type": "workflow",
      "interface": "api/handler.labelsMatchSelector",
      "code_paths": [
        "api/handler/resource_center.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_center_test.go",
          "selector": "TestLabelsMatchSelector"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.resource-center.rfc3339-timestamps",
      "title": "Serialize resource center timestamps as RFC3339",
      "title_zh": "Serialize resource center timestamps as RFC3339",
      "interface_type": "package_function",
      "interface": "api/handler.formatResourceTimestamp",
      "code_paths": [
        "api/handler/resource_center.go",
        "api/handler/ns_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_center_test.go",
          "selector": "TestFormatResourceTimestamp"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.resource-import.daemonset-component",
      "title": "Import DaemonSet as component",
      "title_zh": "\u5c06 DaemonSet \u5bfc\u5165\u4e3a\u7ec4\u4ef6",
      "interface_type": "handler_method",
      "interface": "api.handler.ComponentController.CreateComponent",
      "code_paths": [
        "api/handler/resource_import.go",
        "api/model/namespace_resource.go"
      ],
      "tests": [
        {
          "path": "api/handler/resource_import_daemonset_test.go",
          "selector": "TestExtendMethodForResourceTypeSupportsDaemonSet"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.runtime.composite-nodejs",
      "title": "Use node runtime parser for composite dockerfile and node language",
      "title_zh": "\u590d\u5408\u8bed\u8a00\u573a\u666f\u4f7f\u7528 Node \u8fd0\u884c\u65f6\u89e3\u6790",
      "interface_type": "workflow",
      "interface": "builder/parser/code.CheckRuntime",
      "code_paths": [
        "builder/parser/code/runtime.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/runtime_test.go",
          "selector": "TestCheckRuntime_CompositeNodejsLanguageUsesNodeRuntime"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.runtime.node-cnb-framework-detection",
      "title": "Detect Node.js framework metadata for CNB builds",
      "title_zh": "CNB \u6784\u5efa\u68c0\u6d4b Node.js \u6846\u67b6\u4fe1\u606f",
      "interface_type": "package_function",
      "interface": "builder/parser/code.CheckRuntimeByStrategy",
      "code_paths": [
        "builder/parser/code/runtime.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/runtime_test.go",
          "selector": "TestCheckRuntimeByStrategy_NodejsCNBDetectsFrameworkWithoutEngines"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.runtime.node-defaults",
      "title": "Return default node runtime info from package.json",
      "title_zh": "\u4ece package.json \u8fd4\u56de\u9ed8\u8ba4 Node \u8fd0\u884c\u65f6\u4fe1\u606f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.CheckRuntime",
      "code_paths": [
        "builder/parser/code/runtime.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/runtime_test.go",
          "selector": "TestCheckRuntime_NodejsReturnsDefaultRuntimeInfoFromPackageJson"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.runtime.static-empty",
      "title": "Return empty runtime info for static language",
      "title_zh": "\u9759\u6001\u8bed\u8a00\u8fd4\u56de\u7a7a\u8fd0\u884c\u65f6\u4fe1\u606f",
      "interface_type": "workflow",
      "interface": "builder/parser/code.CheckRuntime",
      "code_paths": [
        "builder/parser/code/runtime.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/runtime_test.go",
          "selector": "TestCheckRuntime_StaticReturnsEmptyRuntimeInfo"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.service-check.completion-log-summary",
      "title": "Service check completion log reflects check status",
      "title_zh": "\u670d\u52a1\u68c0\u6d4b\u5b8c\u6210\u6458\u8981\u65e5\u5fd7\u53cd\u6620\u771f\u5b9e\u68c0\u6d4b\u72b6\u6001",
      "interface_type": "other",
      "interface": "builder/exector.serviceCheckCompletionLogSummary",
      "code_paths": [
        "builder/exector/service_check.go"
      ],
      "tests": [
        {
          "path": "builder/exector/service_check_test.go",
          "selector": "TestServiceCheckCompletionLogSummary"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.service-check.eventlog-progress",
      "title": "Mirror service-check progress messages to the event logger",
      "title_zh": "\u5c06\u670d\u52a1\u68c0\u6d4b\u8fdb\u5ea6\u6d88\u606f\u540c\u6b65\u5199\u5165\u4e8b\u4ef6\u65e5\u5fd7",
      "interface_type": "other",
      "interface": "builder/exector.logServiceCheckProgress",
      "code_paths": [
        "builder/exector/service_check.go"
      ],
      "tests": [
        {
          "path": "builder/exector/service_check_test.go",
          "selector": "TestLogServiceCheckProgressMirrorsMessageToEventLogger"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.service-probe.reconcile-duplicate-mode",
      "title": "Reconcile duplicate service probe modes",
      "title_zh": "\u534f\u8c03\u91cd\u590d\u7684\u7ec4\u4ef6\u63a2\u9488\u6a21\u5f0f",
      "interface_type": "dao_method",
      "interface": "db/mysql/dao.ServiceProbeDaoImpl.AddModel",
      "code_paths": [
        "db/mysql/dao/k8s.go"
      ],
      "tests": [
        {
          "path": "db/mysql/dao/service_probe_test.go",
          "selector": "TestServiceProbeDaoAddModelReconcilesExistingMode"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.service-type.daemonset",
      "title": "DaemonSet service type classification",
      "title_zh": "DaemonSet \u7ec4\u4ef6\u7c7b\u578b\u5206\u7c7b",
      "interface_type": "service_method",
      "interface": "db.model.ServiceType",
      "code_paths": [
        "db/model/tenant.go"
      ],
      "tests": [
        {
          "path": "db/model/tenant_daemonset_test.go",
          "selector": "TestServiceTypeDaemonSetClassification"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.service.file-manage-command-safety",
      "title": "Build safe file-manage list command with path separator",
      "title_zh": "\u6784\u5efa\u5e26\u8def\u5f84\u5206\u9694\u7b26\u7684\u5b89\u5168\u6587\u4ef6\u7ba1\u7406\u5217\u8868\u547d\u4ee4",
      "interface_type": "other",
      "interface": "api/handler.buildFileManageListCommand",
      "code_paths": [
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_file_manage_test.go",
          "selector": "TestBuildFileManageListCommand"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.service.file-manage-exec-error-detail",
      "title": "Preserve exec stderr when file-manage listing fails",
      "title_zh": "\u6587\u4ef6\u7ba1\u7406\u5217\u8868\u5931\u8d25\u65f6\u4fdd\u7559 exec \u7684 stderr \u7ec6\u8282",
      "interface_type": "other",
      "interface": "api/handler.wrapFileManageExecError",
      "code_paths": [
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_file_manage_test.go",
          "selector": "TestWrapFileManageExecErrorIncludesStderr"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.service.port-outer-idempotent-close",
      "title": "Keep repeated external port closes idempotent",
      "title_zh": "Keep repeated external port closes idempotent",
      "interface_type": "handler_method",
      "interface": "api/handler.(*ServiceAction).PortOuter",
      "code_paths": [
        "api/handler/service.go"
      ],
      "tests": [
        {
          "path": "api/handler/service_port_outer_test.go",
          "selector": "TestServiceActionPortOuterAlreadyClosedReturnsPort"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.share.image-from-snapshot-deploy-version",
      "title": "Share image snapshots using the requested deploy version",
      "title_zh": "\u955c\u50cf\u5206\u4eab\u4f7f\u7528\u8bf7\u6c42\u4e2d\u7684\u5feb\u7167\u90e8\u7f72\u7248\u672c",
      "interface_type": "workflow",
      "interface": "api/handler/share.ServiceShareHandle.Share",
      "code_paths": [
        "api/handler/share/service_share.go"
      ],
      "tests": [
        {
          "path": "api/handler/share/service_share_test.go",
          "selector": "TestServiceShareUsesRequestedDeployVersionForImageShare"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.share.slug-from-snapshot-deploy-version",
      "title": "Share slug snapshots using the requested deploy version",
      "title_zh": "Slug \u5206\u4eab\u4f7f\u7528\u8bf7\u6c42\u4e2d\u7684\u5feb\u7167\u90e8\u7f72\u7248\u672c",
      "interface_type": "workflow",
      "interface": "api/handler/share.ServiceShareHandle.Share",
      "code_paths": [
        "api/handler/share/service_share.go"
      ],
      "tests": [
        {
          "path": "api/handler/share/service_share_test.go",
          "selector": "TestServiceShareUsesRequestedDeployVersionForSlugShare"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-args.default-cnb-ports",
      "title": "Apply default CNB ports for multi-language projects",
      "title_zh": "\u4e3a\u591a\u8bed\u8a00\u9879\u76ee\u5e94\u7528\u9ed8\u8ba4 CNB \u7aef\u53e3",
      "interface_type": "workflow",
      "interface": "builder/parser.applyCNBDefaultPorts",
      "code_paths": [
        "builder/parser/source_code.go"
      ],
      "tests": [
        {
          "path": "builder/parser/source_code_args_test.go",
          "selector": "TestCNBDefaultPorts_MultiLanguage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-args.multi-language",
      "title": "Resolve source build args for multi-language projects",
      "title_zh": "\u4e3a\u591a\u8bed\u8a00\u9879\u76ee\u89e3\u6790\u6e90\u7801\u6784\u5efa\u53c2\u6570",
      "interface_type": "workflow",
      "interface": "builder/parser.SourceCodeParse.GetArgs",
      "code_paths": [
        "builder/parser/source_code.go"
      ],
      "tests": [
        {
          "path": "builder/parser/source_code_args_test.go",
          "selector": "TestGetArgs_MultiLanguage"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-detect.dockerfile-subdir",
      "title": "Detect Dockerfile in nested source directory",
      "title_zh": "\u8bc6\u522b\u5b50\u76ee\u5f55\u4e2d\u7684 Dockerfile",
      "interface_type": "workflow",
      "interface": "builder/parser/code.GetLangType",
      "code_paths": [
        "builder/parser/code/lang.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/language_matrix_test.go",
          "selector": "TestGetLangType_DetectsDockerfileInSubDirectory"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-detect.hidden-dockerfiles",
      "title": "Detect Dockerfiles inside hidden directories",
      "title_zh": "\u8bc6\u522b\u9690\u85cf\u76ee\u5f55\u4e2d\u7684 Dockerfile",
      "interface_type": "workflow",
      "interface": "builder/parser/code.FindDockerfiles",
      "code_paths": [
        "builder/parser/code/lang.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/lang_test.go",
          "selector": "TestFindDockerfilesInHiddenDirs"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-detect.ignore-excluded-dirs",
      "title": "Ignore excluded directories when scanning Dockerfiles",
      "title_zh": "\u626b\u63cf Dockerfile \u65f6\u5ffd\u7565\u6392\u9664\u76ee\u5f55",
      "interface_type": "workflow",
      "interface": "builder/parser/code.FindDockerfiles",
      "code_paths": [
        "builder/parser/code/lang.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/lang_test.go",
          "selector": "TestFindDockerfilesIgnoreSpecificDirs"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-detect.language-matrix",
      "title": "Detect supported source-build language matrix",
      "title_zh": "\u8bc6\u522b\u652f\u6301\u7684\u6e90\u7801\u6784\u5efa\u8bed\u8a00\u77e9\u9635",
      "interface_type": "workflow",
      "interface": "builder/parser/code.GetLangType",
      "code_paths": [
        "builder/parser/code/lang.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/language_matrix_test.go",
          "selector": "TestGetLangType_SupportedSourceBuildLanguages"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-detect.multi-module-dockerfile",
      "title": "Preserve Dockerfile detection for Maven modules",
      "title_zh": "Preserve Dockerfile detection for Maven modules",
      "interface_type": "workflow",
      "interface": "builder/parser.SourceCodeParse.GetServiceInfo",
      "code_paths": [
        "builder/parser/source_code.go"
      ],
      "tests": [
        {
          "path": "builder/parser/source_code_args_test.go",
          "selector": "TestGetServiceInfo_MultiModulesPreserveDockerfileDetection"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-detect.nodejs-over-static",
      "title": "Prefer Node.js over static when package.json exists",
      "title_zh": "\u5b58\u5728 package.json \u65f6\u4f18\u5148\u8bc6\u522b\u4e3a Node.js",
      "interface_type": "workflow",
      "interface": "builder/parser/code.GetLangType",
      "code_paths": [
        "builder/parser/code/lang.go"
      ],
      "tests": [
        {
          "path": "builder/parser/code/language_matrix_test.go",
          "selector": "TestGetLangType_NodeJsWinsOverStaticWhenPackageJsonExists"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-discovery.etcd-config",
      "title": "Configure parser etcd discovery and guard fetch without client",
      "title_zh": "\u914d\u7f6e parser \u7684 etcd \u53d1\u73b0\u5668\u5e76\u5728\u65e0\u5ba2\u6237\u7aef\u65f6\u4fdd\u62a4\u6293\u53d6\u903b\u8f91",
      "interface_type": "workflow",
      "interface": "builder/parser/discovery.NewEtcd",
      "code_paths": [
        "builder/parser/discovery/etcd.go"
      ],
      "tests": [
        {
          "path": "builder/parser/discovery/etcd_test.go",
          "selector": "TestNewEtcdAndFetchGuard"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-discovery.unsupported-type",
      "title": "Return no discoverier for unsupported parser discovery types",
      "title_zh": "\u5bf9\u4e0d\u652f\u6301\u7684 parser \u53d1\u73b0\u7c7b\u578b\u8fd4\u56de\u7a7a\u53d1\u73b0\u5668",
      "interface_type": "workflow",
      "interface": "builder/parser/discovery.NewDiscoverier",
      "code_paths": [
        "builder/parser/discovery/discovery.go"
      ],
      "tests": [
        {
          "path": "builder/parser/discovery/discovery_unit_test.go",
          "selector": "TestNewDiscoverierUnsupportedType"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-image.auth-base64-encode",
      "title": "Encode registry auth config as base64 JSON payload",
      "title_zh": "\u5c06\u955c\u50cf\u4ed3\u5e93\u8ba4\u8bc1\u4fe1\u606f\u7f16\u7801\u4e3a base64 JSON \u8f7d\u8377",
      "interface_type": "workflow",
      "interface": "builder/sources.EncodeAuthToBase64",
      "code_paths": [
        "builder/sources/image.go"
      ],
      "tests": [
        {
          "path": "builder/sources/image_test.go",
          "selector": "TestEncodeAuthToBase64"
        }
      ],
      "test_type": "regression",
      "status": "active"
    },
    {
      "id": "rainbond.source-image.import",
      "title": "Import image from archive",
      "title_zh": "\u4ece\u5f52\u6863\u6587\u4ef6\u5bfc\u5165\u955c\u50cf",
      "interface_type": "workflow",
      "interface": "builder/sources.ImageImport",
      "code_paths": [
        "builder/sources/image.go"
      ],
      "tests": [
        {
          "path": "builder/sources/image_test.go",
          "selector": "TestImageImport"
        }
      ],
      "test_type": "integration",
      "status": "active"
    },
    {
      "id": "rainbond.source-image.multi-save",
      "title": "Save multiple images to archive",
      "title_zh": "\u5c06\u591a\u4e2a\u955c\u50cf\u4fdd\u5b58\u4e3a\u5f52\u6863\u6587\u4ef6",
      "interface_type": "workflow",
      "interface": "builder/sources.MultiImageSave",
      "code_paths": [
        "builder/sources/image.go"
      ],
      "tests": [