[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ACRV1XFK697XTRPZA30732":3,"skill-same:01M6ACRV1XFK697XTRPZA30732":97},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":23,"linkOnly":24,"markdownContent":25,"markdownBody":26,"frontMatter":27,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":33,"ownerHtmlUrl":34,"ownerBlogUrl":35,"ownerDescription":6,"updatedAt":36,"install":37,"resources":50},"01M6ACRV1XFK697XTRPZA30732","sync-submodule",null,"Checklist and steps for syncing the skywalking submodule to a new upstream tag or commit. Covers all required checks and updates.","apache\u002Fskywalking-graalvm-distro","apache","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47359?v=4","01M6AC83E6K4FDKK7HZ8WNMQKE","The Apache Software Foundation","01M6ACRKQKBZP6VGQW943632GQ",13,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-graalvm-distro\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsync-submodule\u002FSKILL.md",[],[19,20,21,22],"sync","sync submodule","commit","skywalking","2026-11-10 10:12:30",false,"---\nname: sync-submodule\ndescription: Checklist and steps for syncing the skywalking submodule to a new upstream tag or commit. Covers all required checks and updates.\n---\n\n# Sync SkyWalking Submodule\n\nChecklist for updating the `skywalking\u002F` submodule to a new upstream tag\u002Fcommit.\n\n## 1. Update Submodule\n\n```bash\ncd skywalking && git fetch origin --tags && git checkout \u003Ctag-or-commit>\n```\n\nVerify the upstream `\u003Crevision>` in `skywalking\u002Fpom.xml` — the Makefile extracts it for `-Dskywalking.version`.\n\n## 2. Install Upstream to Local Maven Repo\n\n```bash\nmake init-skywalking\n```\n\n## 3. Analyze Changes\n\nCompare the old and new commits to identify what changed:\n\n```bash\ncd skywalking && git log --oneline \u003Cold-commit>..\u003Cnew-commit>\n```\n\n### Key areas to check for impact\n\n| Area | What to look for |\n|------|-----------------|\n| **OAL engine** (`oal-rt\u002F`) | API changes to `OALEngineV2` |\n| **MAL engine** (`meter-analyzer\u002F`) | API changes to `MALClassGenerator`, new grammar tokens |\n| **LAL engine** (`log-analyzer\u002F`) | API changes to `LALClassGenerator` |\n| **TAL engine** (`trace-analyzer\u002F`) | API changes to `TALClassGenerator`, `TalDSL.of`, `TALConfigs.load`, metric declaration fields |\n| **New modules** | New `ModuleDefine`\u002F`ModuleProvider` classes |\n| **New OAL files** | `oal\u002F*.oal` |\n| **New MAL rules** | `otel-rules\u002F`, `meter-analyzer-config\u002F`, `log-mal-rules\u002F`, `envoy-metrics-rules\u002F`, `telegraf-rules\u002F`, `zabbix-rules\u002F` |\n| **New LAL rules** | `lal\u002F*.yaml` |\n| **New TAL rules** | `tal\u002F*.yaml` |\n| **Same-FQCN files changed** | Upstream versions of files we replace in `oap-libs-for-graalvm\u002F` |\n| **New config fields** | Changes to `ModuleConfig` subclasses |\n| **application.yml** | New module sections, new config properties |\n| **pom.xml deps** | New module artifacts, version bumps |\n\n## 4. Required Updates (Checklist)\n\n### Module wiring (if new modules added)\n\n- [ ] Add dependency to root `pom.xml` `\u003CdependencyManagement>`\n- [ ] Add dependency to `oap-graalvm-server\u002Fpom.xml` `\u003Cdependencies>`\n- [ ] Register module+provider in `GraalVMOAPServerStartUp.java`\n- [ ] Add `(moduleName, providerName)` pair to `AcceptedModules.java`\n- [ ] Add module config section to `application.yml`\n\n### Config handling (if new ModuleConfig classes)\n\n- [ ] Re-run config-generator to regenerate `YamlConfigLoaderUtils.java` and `module-config-classes.txt`:\n  ```bash\n  .\u002Fmvnw -pl build-tools\u002Fbuild-common,build-tools\u002Fconfig-generator install -DskipTests -Dskywalking.version=\u003Cversion>\n  .\u002Fmvnw -pl build-tools\u002Fconfig-generator exec:java \\\n    -Dexec.args=\"oap-graalvm-server\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fskywalking\u002Foap\u002Fserver\u002Flibrary\u002Futil\u002FYamlConfigLoaderUtils.java build-tools\u002Fprecompiler\u002Fsrc\u002Fmain\u002Fresources\u002FMETA-INF\u002Fmodule-config-classes.txt\" \\\n    -Dskywalking.version=\u003Cversion>\n  ```\n- [ ] If config class has no `@Setter` at class level, create same-FQCN replacement in `oap-libs-for-graalvm\u002F` with `@Setter` added\n- [ ] Add shade exclusion for replaced config class\n\n### OAL changes (if new .oal files or scopes)\n\n- [ ] New OAL files are auto-discovered via `OALDefine` SPI — verify in precompiler output\n- [ ] Add generated metrics + builder classes to `reachability-metadata.json` in `oap-graalvm-native`\n- [ ] Verify with: `jar tf build-tools\u002Fprecompiler\u002Ftarget\u002Fprecompiler-*-generated.jar | grep \"oal\u002Frt\"`\n\n### Rule adoption policy (OAL \u002F MAL \u002F LAL \u002F TAL)\n\n**Every rule file upstream adds or changes is adopted, without exception.** The distro must\nnever trail upstream on bundled rules. Concretely, for each new or changed file:\n\n- [ ] It is pre-compiled: `otel-rules\u002F**`, `meter-analyzer-config\u002F*`, `log-mal-rules\u002F*`,\n      `envoy-metrics-rules\u002F*`, `telegraf-rules\u002F*`, `zabbix-rules\u002F*`, `lal\u002F*`, `tal\u002F*`, `oal\u002F*.oal` are all\n      auto-discovered by the precompiler; verify the counts in its log (`MAL: compiled N rules from \u003Cdir>`,\n      `LAL pre-compilation`, `TAL pre-compilation`, `Precompiler: N metrics`).\n- [ ] It is enabled by default exactly as upstream: mirror upstream `application.yml`\n      (`enabledOtelMetricsRules`, `meterAnalyzerActiveFiles`, `lalFiles`, `malFiles`, ...).\n- [ ] `rule-file-inventory.properties` (+ section counts) and `precompiled-yaml-sha256.properties` cover it.\n- [ ] A MAL comparison test exists for every new MAL file (auto-discovery mode:\n      `generateComparisonTests(\"\u003Cdir>\u002F\u003Cfile>.yaml\")`); LAL tests for new LAL files.\n- [ ] `docs\u002Fdistro-policy.md` counts are refreshed.\n- [ ] It is browsable: the precompiler exports raw rule files to `META-INF\u002Frule-source\u002F` for the\n      read-only `\u002Fruntime\u002Frule` + `\u002Fruntime\u002Foal` catalogs — nothing to do per file, but keep\n      `BundledRuleCatalogHandlerTest` expectations current if a file is renamed.\n\n### E2E adoption\n\nWhen upstream adds an e2e case for a new rule set, adopt it if it is compose-only:\n\n- [ ] Prefer mock\u002Freplay style cases (e.g. `airflow\u002Fmock`, `banyandb`) over ones that need a real\n      product cluster or build an agent from source; those go to the CI matrix only if cheap.\n- [ ] Copy the case to `test\u002Fe2e\u002Fcases\u002F\u003Cname>\u002F` with the distro `oap` service (image\n      `skywalking-oap-native:latest`, `SW_HEALTH_CHECKER\u002FSW_STORAGE_BANYANDB_TARGETS\u002FSW_CONFIGURATION`,\n      the `nc 11800` healthcheck) and reference the upstream case files by relative path\n      (`..\u002F..\u002F..\u002F..\u002Fskywalking\u002Ftest\u002Fe2e-v2\u002Fcases\u002F\u003Ccase>\u002F...`) for build contexts, mounted configs and\n      `verify.cases.includes` so expectations track upstream automatically.\n- [ ] Add a `.github\u002Fworkflows\u002Fci.yml` e2e matrix entry.\n- [ ] Not adoptable: cases that mount rule YAML at runtime (needs runtime compile), `runtime-rule\u002F*`,\n      `dsl-debugging\u002F{mal,lal-*}` (seed rules via runtime-rule), ZooKeeper\u002Fetcd cluster cases.\n      `dsl-debugging\u002Foal` IS adopted (`test\u002Fe2e\u002Fcases\u002Fdsl-debugging-oal`): it debugs a bundled OAL rule.\n- [ ] DSL debugging stays live: the precompiler calls `DSLDebugCodegenSwitch.enableInjection()` before\n      generating and sets `setContent(...)` on the MAL\u002FLAL generators; if upstream changes the probe\n      codegen or `GateHolder`, re-check the `dsl-management`, `dsl-debugging` and `dsl-debugging-oal` e2e cases.\n\n### MAL\u002FLAL changes (if new rule files)\n\n- [ ] New MAL rules under `otel-rules\u002F` with glob `**\u002F*` are auto-compiled by precompiler\n- [ ] New LAL rules must be added to `lalFiles` in `application.yml`\n- [ ] Update `enabledOtelMetricsRules` in `application.yml` for new otel rule directories\n- [ ] Create MAL comparison tests in `oap-graalvm-server\u002Fsrc\u002Ftest\u002F...\u002Fmal\u002F`\n\n### Inventory updates\n\n- [ ] Add new provider to `provider-inventory.properties`\n- [ ] Add new rule files to `rule-file-inventory.properties`\n\n### Distribution packaging\n\n- [ ] Add runtime config files (not DSL scripts) to `distribution.xml` and `native-distribution.xml`\n- [ ] Update `docs\u002Fdistro-policy.md` module table\n- [ ] Update `docs\u002Fversion-mapping.md`\n\n### E2E test environment\n\n- [ ] Update `test\u002Fe2e\u002Fscript\u002Fenv`:\n  - `SW_UPSTREAM_COMMIT` — submodule HEAD\n  - `SW_E2E_SERVICE_COMMIT` — last commit touching `test\u002Fe2e-v2\u002Fjava-test-service\u002F`\n  - `SW_BANYANDB_COMMIT` — match upstream `test\u002Fe2e-v2\u002Fscript\u002Fenv`\n  - `SW_AGENT_JAVA_COMMIT` — match upstream\n- [ ] Add new e2e test cases if upstream added new features with e2e tests\n- [ ] Add new test entries to `.github\u002Fworkflows\u002Fci.yml` matrix\n\n### Same-FQCN replacement staleness\n\n- [ ] Run `ReplacementClassStalenessTest` — if upstream changed files we replace, update replacements\n- [ ] Run `PrecompiledYamlStalenessTest` — update SHA-256 hashes for changed YAML files\n\n## 5. Build & Test\n\n```bash\nmake compile          # Compile everything\nmake test             # Run all 1300+ tests\n```\n\n## 6. Native Image Verification\n\n```bash\nmake native-image-macos   # Cross-compile for Linux (on macOS)\nmake docker-native        # Build Docker image\ndocker tag skywalking-oap-native skywalking-oap-native:latest\n\n# Run e2e smoke test\ne2e run -c test\u002Fe2e\u002Fcases\u002Fsimple-java-agent\u002Fe2e.yaml\n```\n\nCheck OAP logs for reflection errors:\n```bash\ndocker logs \u003Ccontainer> 2>&1 | grep \"ERROR\\|NoSuchMethodException\\|ClassNotFoundException\"\n```\n\n## 7. Common Pitfalls\n\n- **New module = three lists**: `GraalVMOAPServerStartUp` registration, `provider-inventory.properties`, AND\n  `build-tools\u002Fbuild-common\u002F...\u002FAcceptedModules.java`. The config-generator discovers providers only through\n  `AcceptedModules`, so a module missing there gets no `copyTo\u003CConfig>` branch in `YamlConfigLoaderUtils` and the\n  OAP dies at boot with `Unknown config type` — after the JVM unit tests passed.\n- **Always `.\u002Fmvnw clean install` before a native build after a submodule bump**: a resumed build\n  (`-rf :precompiler`, no clean) reuses the old `oap-libs-for-graalvm\u002F*\u002Ftarget\u002F*.jar`, and\n  maven-shade merges that stale shaded jar with the fresh upstream jar; the stale copy wins, JVM\n  unit tests still pass, and the native OAP dies at boot with `NoClassDefFoundError` on a moved class.\n- **Same-name MAL counter windows**: since 11.0.0 `CounterWindow` is keyed by sample name, not\n  metric name, so the comparison harness runs the fresh and pre-compiled paths back to back with a\n  `CounterWindow.INSTANCE.reset()` in between.\n- **Diff the public API of every same-FQCN replacement, not only the constructors**: a Lombok\n  `@Getter` upstream adds a method the replacement must keep (11.0.0: `FilterExpression#getLiteral()`,\n  read by `Analyzer` only inside the debug-gated filter probe). The comparison tests never take that\n  branch, so the miss surfaces as `NoSuchMethodError` on the ingestion thread the moment an operator\n  starts a session. `FilteredRuleDebugCaptureTest` covers the MAL filter probe; add the equivalent\n  when a new probe reads a replaced class.\n- **Protobuf `JsonFormat` needs reflection metadata**: it prints\u002Fparses generated messages through\n  the accessor table, which looks getters up with `Class.getMethod`. The precompiler registers the\n  descriptor closure of every LAL input type plus the OTLP\u002FHTTP JSON receivers' `Export*ServiceRequest`\n  and `LogData` (`protoJsonRoots` → `addProtoMessageEntries`); when upstream starts JSON-parsing or\n  printing another generated type (`git grep \"JsonFormat\\.(parser|printer)\"`), extend the root set or\n  the native image answers `Generated message class ... missing method ...` (11.1: the ai-agent\n  case's OTLP\u002FJSON log posts exposed the missing OTLP roots).\n- **`LALOutputBuilder` implementations are a hand list**: the precompiler resolves `outputType` short\n  names through the SPI at build time, but their reflection entries sit in `Precompiler`'s\n  `configPojos` list. A new builder (11.1: `ConversationFile` from `ai-agent-conversation`) goes on\n  that list, and its module must be a precompiler dependency or the LAL rule fails to compile.\n- **Explicit-input MAL tests go stale when upstream adds a rule to an existing file**: `OapTest`-style\n  tests (hand-built `buildInput`) fail with \"both paths returned EMPTY\" on the new rule until its\n  sample family is added to the input; auto-discovery tests pick new rules up by themselves.\n- **Classpath resources must be globbed into the native image**: `oap-graalvm-native`'s\n  `reachability-metadata.json` lists the resources the binary embeds. JVM unit tests never notice a\n  missing one; the native OAP dies at boot (11.1: `classpath:query-protocol\u002Fgen-ai-evaluation-record.graphqls`,\n  now covered by the `query-protocol\u002F*.graphqls` glob). When upstream starts reading a new\n  classpath resource (not a `config\u002F` file), add a glob there and boot the native image.\n- **Armeria instantiates handler-referenced classes reflectively**: `@ExceptionHandler`,\n  `@RequestConverter` and `@Decorator` targets need constructor metadata. The precompiler's\n  `scanArmeriaHandlers` collects all three (11.1 added `@Decorator` for the AI agent conversation\n  view's `CompressResponse`; without it the native OAP dies at boot with \"cannot inject the\n  dependency for ...\"). A new Armeria annotation that names a class needs the same treatment.\n- **Jackson response POJOs need reflection metadata**: Armeria `HttpResponse.ofJson(pojo)` \u002F\n  `@ProducesJson` serialize through Jackson, which finds no properties in the native image without\n  metadata and answers HTTP 400 (\"No serializer found for class ...\"). The precompiler's\n  `scanQueryEntityClasses` covers `org.apache.skywalking.oap.query.*.entity.*` and\n  `org.apache.skywalking.oap.server.admin.*.response.*` (the latter added in 11.1 after the storage\n  suite's `admin inspect` cases exposed it); a POJO outside those packages must be registered by hand.\n  The same holds for request bodies (`@ConsumesJson`) and for Gson-printed answers, which silently come out as\n  `{}` instead of failing. 11.1 found three that no e2e case reached: `\u002Fstatus\u002Fcluster\u002Fnodes` (core `Address`,\n  HTTP 500), `\u002Fstatus\u002Falarm\u002F*` (`core.alarm.provider.status`, `{}`) and the AWS Firehose receiver (`FirehoseReq`,\n  HTTP 400 on every post). Audit with `git grep -n \"@ProducesJson\\|@ConsumesJson\\|ofJson(\\|GSON.toJson\"` over\n  the handlers (and `@RequestObject` parameters) and boot the native image against each route.\n- **Stale upstream build output hides missing metadata**: `make init-skywalking` does not clean, so a resource\n  upstream deleted survives in `skywalking\u002F**\u002Ftarget\u002Fclasses` and the installed jars, and the precompiler still\n  scans it. 11.0.0 deleted `query-protocol\u002Fui-configuration.graphqls`; a local tree kept it, so the GraphQL type\n  scan kept registering `DashboardSetting` and `ui-management` passed locally while CI's clean build failed it.\n  Compare the precompiler's `Scanned GraphQL types: N matched from M schema types` and `Generated reflect-config.json\n  with N entries` lines with CI's, and clean-install any upstream module whose `target\u002Fclasses` holds files its\n  `src\u002Fmain\u002Fresources` no longer has.\n- **Native OAP boots faster than upstream assumes**: a case whose BanyanDB has no healthcheck\n  (`service_started` only, e.g. the distroless `-plugins` image) lets the native OAP connect before\n  BanyanDB listens, and it exits on `UNAVAILABLE`. Wrap the OAP entrypoint in `until nc -z ...`.\n- **Upstream e2e cases that bind-mount `java-test-service` jars**: don't build them in CI; every module\n  is published as `ghcr.io\u002Fapache\u002Fskywalking\u002F\u003Cmodule>:${SW_E2E_SERVICE_COMMIT}` with the jar at\n  `\u002Fapp.jar` — run the image directly, or copy the jar out through an init container when an agent\n  image must run it (`virtual-genai` spring-ai-service, `banyandb-trace-sampling` trace-mocker).\n\n- **A DSL that creates metrics needs both `MeterSystem` replacements to track upstream's API**: the\n  precompiler's build-time `MeterSystem` (`build-tools\u002Fprecompiler\u002F...`) and the runtime one\n  (`server-core-for-graalvm`). 11.1 TAL calls `createMetrics` → `MeterSystem#limitLabels`, which\n  neither replacement had; the build-time call fails the precompiler, the runtime one fails boot. TAL\n  creates its metrics through the shared build-time `MeterSystem`, so its meter classes land in\n  `tal-meter-classes.txt`, and the runtime `TalDSL` replays `create` + `limitLabels` from the manifest.\n- **Retire a replacement when upstream removes the reason for it**: 11.1 `HttpAlarmCallback` moved its\n  `HttpClient` from a static field to a constructor argument; keeping the old lazy-static replacement\n  would have dropped the constructor every hook subclass calls. Diff each changed replacement's upstream\n  source against the *reason* in its header, not only its API.\n- **Stream data registered by hand needs constructor metadata**: `IWorkerInstanceSetter.put(..., Class)`\n  of a non-`@Stream` class (11.1: TAL `PairingFact`) is rebuilt by `RemoteHandleWorker` with\n  `newInstance()` on the receiving OAP node. The StorageBuilders scan misses it, and only a cluster\n  shows the failure. Add a constructor entry in `Precompiler.generateReflectConfig`.\n- **Jackson YAML\u002FJSON DTOs outside `*.entity.*` \u002F `*.response.*`**: the status module's `\u002Fdebugging\u002F*`\n  bodies (`Debugging*Rsp`) are serialized by Jackson; the entity scan covers them since 11.1. A new\n  handler that returns POJOs from another package must be added to `scanQueryEntityClasses`.\n- **Upstream default switches can silently empty an e2e case**: 11.1 made native OTLP span storage the\n  default, so `otlp-traces` (Zipkin API assertions) needs `SW_OTEL_TRACE_STORAGE: zipkin`.\n\n- **Diff upstream `server-starter`'s dependencies against the distro poms on every sync**: a module that\n  ships only SPI implementations, no `ModuleDefine`, is invisible to `ImmigrationScopeTest`. `ios-analyzer`\n  (iOS `SpanListener`s, 11.0.0) was never bundled, and the iOS MAL\u002FLAL rules kept the gap hidden until the\n  `ios` e2e case was adopted in 11.1. Anything missing must be policy-excluded (cluster\u002Fconfiguration\u002Fstorage\n  plugins, `runtime-rule`) or added.\n- **TAL rules are user-editable**: keep the precompiler pass and the `TalDSL` \u002F `TALConfigs` replacements free of\n  shipped-rule assumptions. `TALPrecompileTest` (fixtures) and `TALDocScriptsTest` (upstream's documented scripts,\n  extracted from the docs and spliced where the practices page says) guard that; when upstream's docs move a\n  snippet or the shipped rule loses an anchor line, the test names it.\n\n- **Reflection errors at native image runtime**: New classes instantiated via `Class.forName().newInstance()` need entries in `reflect-config.json` or `reachability-metadata.json`\n- **Config loading failures**: New `ModuleConfig` subclasses need config-generator regeneration AND may need `@Setter` same-FQCN replacement\n- **Missing config files**: Runtime config files (non-DSL) must be in distribution assembly descriptors\n- **OAL builder registration**: OAL-generated builder classes need constructor entries in `reachability-metadata.json`\n- **Config-generator runs against upstream classpath**: Setter checks see upstream classes (no `@Setter`), not our for-graalvm replacements — the generator trusts that for-graalvm modules will provide setters","# Sync SkyWalking Submodule\n\nChecklist for updating the `skywalking\u002F` submodule to a new upstream tag\u002Fcommit.\n\n## 1. Update Submodule\n\n```bash\ncd skywalking && git fetch origin --tags && git checkout \u003Ctag-or-commit>\n```\n\nVerify the upstream `\u003Crevision>` in `skywalking\u002Fpom.xml` — the Makefile extracts it for `-Dskywalking.version`.\n\n## 2. Install Upstream to Local Maven Repo\n\n```bash\nmake init-skywalking\n```\n\n## 3. Analyze Changes\n\nCompare the old and new commits to identify what changed:\n\n```bash\ncd skywalking && git log --oneline \u003Cold-commit>..\u003Cnew-commit>\n```\n\n### Key areas to check for impact\n\n| Area | What to look for |\n|------|-----------------|\n| **OAL engine** (`oal-rt\u002F`) | API changes to `OALEngineV2` |\n| **MAL engine** (`meter-analyzer\u002F`) | API changes to `MALClassGenerator`, new grammar tokens |\n| **LAL engine** (`log-analyzer\u002F`) | API changes to `LALClassGenerator` |\n| **TAL engine** (`trace-analyzer\u002F`) | API changes to `TALClassGenerator`, `TalDSL.of`, `TALConfigs.load`, metric declaration fields |\n| **New modules** | New `ModuleDefine`\u002F`ModuleProvider` classes |\n| **New OAL files** | `oal\u002F*.oal` |\n| **New MAL rules** | `otel-rules\u002F`, `meter-analyzer-config\u002F`, `log-mal-rules\u002F`, `envoy-metrics-rules\u002F`, `telegraf-rules\u002F`, `zabbix-rules\u002F` |\n| **New LAL rules** | `lal\u002F*.yaml` |\n| **New TAL rules** | `tal\u002F*.yaml` |\n| **Same-FQCN files changed** | Upstream versions of files we replace in `oap-libs-for-graalvm\u002F` |\n| **New config fields** | Changes to `ModuleConfig` subclasses |\n| **application.yml** | New module sections, new config properties |\n| **pom.xml deps** | New module artifacts, version bumps |\n\n## 4. Required Updates (Checklist)\n\n### Module wiring (if new modules added)\n\n- [ ] Add dependency to root `pom.xml` `\u003CdependencyManagement>`\n- [ ] Add dependency to `oap-graalvm-server\u002Fpom.xml` `\u003Cdependencies>`\n- [ ] Register module+provider in `GraalVMOAPServerStartUp.java`\n- [ ] Add `(moduleName, providerName)` pair to `AcceptedModules.java`\n- [ ] Add module config section to `application.yml`\n\n### Config handling (if new ModuleConfig classes)\n\n- [ ] Re-run config-generator to regenerate `YamlConfigLoaderUtils.java` and `module-config-classes.txt`:\n  ```bash\n  .\u002Fmvnw -pl build-tools\u002Fbuild-common,build-tools\u002Fconfig-generator install -DskipTests -Dskywalking.version=\u003Cversion>\n  .\u002Fmvnw -pl build-tools\u002Fconfig-generator exec:java \\\n    -Dexec.args=\"oap-graalvm-server\u002Fsrc\u002Fmain\u002Fjava\u002Forg\u002Fapache\u002Fskywalking\u002Foap\u002Fserver\u002Flibrary\u002Futil\u002FYamlConfigLoaderUtils.java build-tools\u002Fprecompiler\u002Fsrc\u002Fmain\u002Fresources\u002FMETA-INF\u002Fmodule-config-classes.txt\" \\\n    -Dskywalking.version=\u003Cversion>\n  ```\n- [ ] If config class has no `@Setter` at class level, create same-FQCN replacement in `oap-libs-for-graalvm\u002F` with `@Setter` added\n- [ ] Add shade exclusion for replaced config class\n\n### OAL changes (if new .oal files or scopes)\n\n- [ ] New OAL files are auto-discovered via `OALDefine` SPI — verify in precompiler output\n- [ ] Add generated metrics + builder classes to `reachability-metadata.json` in `oap-graalvm-native`\n- [ ] Verify with: `jar tf build-tools\u002Fprecompiler\u002Ftarget\u002Fprecompiler-*-generated.jar | grep \"oal\u002Frt\"`\n\n### Rule adoption policy (OAL \u002F MAL \u002F LAL \u002F TAL)\n\n**Every rule file upstream adds or changes is adopted, without exception.** The distro must\nnever trail upstream on bundled rules. Concretely, for each new or changed file:\n\n- [ ] It is pre-compiled: `otel-rules\u002F**`, `meter-analyzer-config\u002F*`, `log-mal-rules\u002F*`,\n      `envoy-metrics-rules\u002F*`, `telegraf-rules\u002F*`, `zabbix-rules\u002F*`, `lal\u002F*`, `tal\u002F*`, `oal\u002F*.oal` are all\n      auto-discovered by the precompiler; verify the counts in its log (`MAL: compiled N rules from \u003Cdir>`,\n      `LAL pre-compilation`, `TAL pre-compilation`, `Precompiler: N metrics`).\n- [ ] It is enabled by default exactly as upstream: mirror upstream `application.yml`\n      (`enabledOtelMetricsRules`, `meterAnalyzerActiveFiles`, `lalFiles`, `malFiles`, ...).\n- [ ] `rule-file-inventory.properties` (+ section counts) and `precompiled-yaml-sha256.properties` cover it.\n- [ ] A MAL comparison test exists for every new MAL file (auto-discovery mode:\n      `generateComparisonTests(\"\u003Cdir>\u002F\u003Cfile>.yaml\")`); LAL tests for new LAL files.\n- [ ] `docs\u002Fdistro-policy.md` counts are refreshed.\n- [ ] It is browsable: the precompiler exports raw rule files to `META-INF\u002Frule-source\u002F` for the\n      read-only `\u002Fruntime\u002Frule` + `\u002Fruntime\u002Foal` catalogs — nothing to do per file, but keep\n      `BundledRuleCatalogHandlerTest` expectations current if a file is renamed.\n\n### E2E adoption\n\nWhen upstream adds an e2e case for a new rule set, adopt it if it is compose-only:\n\n- [ ] Prefer mock\u002Freplay style cases (e.g. `airflow\u002Fmock`, `banyandb`) over ones that need a real\n      product cluster or build an agent from source; those go to the CI matrix only if cheap.\n- [ ] Copy the case to `test\u002Fe2e\u002Fcases\u002F\u003Cname>\u002F` with the distro `oap` service (image\n      `skywalking-oap-native:latest`, `SW_HEALTH_CHECKER\u002FSW_STORAGE_BANYANDB_TARGETS\u002FSW_CONFIGURATION`,\n      the `nc 11800` healthcheck) and reference the upstream case files by relative path\n      (`..\u002F..\u002F..\u002F..\u002Fskywalking\u002Ftest\u002Fe2e-v2\u002Fcases\u002F\u003Ccase>\u002F...`) for build contexts, mounted configs and\n      `verify.cases.includes` so expectations track upstream automatically.\n- [ ] Add a `.github\u002Fworkflows\u002Fci.yml` e2e matrix entry.\n- [ ] Not adoptable: cases that mount rule YAML at runtime (needs runtime compile), `runtime-rule\u002F*`,\n      `dsl-debugging\u002F{mal,lal-*}` (seed rules via runtime-rule), ZooKeeper\u002Fetcd cluster cases.\n      `dsl-debugging\u002Foal` IS adopted (`test\u002Fe2e\u002Fcases\u002Fdsl-debugging-oal`): it debugs a bundled OAL rule.\n- [ ] DSL debugging stays live: the precompiler calls `DSLDebugCodegenSwitch.enableInjection()` before\n      generating and sets `setContent(...)` on the MAL\u002FLAL generators; if upstream changes the probe\n      codegen or `GateHolder`, re-check the `dsl-management`, `dsl-debugging` and `dsl-debugging-oal` e2e cases.\n\n### MAL\u002FLAL changes (if new rule files)\n\n- [ ] New MAL rules under `otel-rules\u002F` with glob `**\u002F*` are auto-compiled by precompiler\n- [ ] New LAL rules must be added to `lalFiles` in `application.yml`\n- [ ] Update `enabledOtelMetricsRules` in `application.yml` for new otel rule directories\n- [ ] Create MAL comparison tests in `oap-graalvm-server\u002Fsrc\u002Ftest\u002F...\u002Fmal\u002F`\n\n### Inventory updates\n\n- [ ] Add new provider to `provider-inventory.properties`\n- [ ] Add new rule files to `rule-file-inventory.properties`\n\n### Distribution packaging\n\n- [ ] Add runtime config files (not DSL scripts) to `distribution.xml` and `native-distribution.xml`\n- [ ] Update `docs\u002Fdistro-policy.md` module table\n- [ ] Update `docs\u002Fversion-mapping.md`\n\n### E2E test environment\n\n- [ ] Update `test\u002Fe2e\u002Fscript\u002Fenv`:\n  - `SW_UPSTREAM_COMMIT` — submodule HEAD\n  - `SW_E2E_SERVICE_COMMIT` — last commit touching `test\u002Fe2e-v2\u002Fjava-test-service\u002F`\n  - `SW_BANYANDB_COMMIT` — match upstream `test\u002Fe2e-v2\u002Fscript\u002Fenv`\n  - `SW_AGENT_JAVA_COMMIT` — match upstream\n- [ ] Add new e2e test cases if upstream added new features with e2e tests\n- [ ] Add new test entries to `.github\u002Fworkflows\u002Fci.yml` matrix\n\n### Same-FQCN replacement staleness\n\n- [ ] Run `ReplacementClassStalenessTest` — if upstream changed files we replace, update replacements\n- [ ] Run `PrecompiledYamlStalenessTest` — update SHA-256 hashes for changed YAML files\n\n## 5. Build & Test\n\n```bash\nmake compile          # Compile everything\nmake test             # Run all 1300+ tests\n```\n\n## 6. Native Image Verification\n\n```bash\nmake native-image-macos   # Cross-compile for Linux (on macOS)\nmake docker-native        # Build Docker image\ndocker tag skywalking-oap-native skywalking-oap-native:latest\n\n# Run e2e smoke test\ne2e run -c test\u002Fe2e\u002Fcases\u002Fsimple-java-agent\u002Fe2e.yaml\n```\n\nCheck OAP logs for reflection errors:\n```bash\ndocker logs \u003Ccontainer> 2>&1 | grep \"ERROR\\|NoSuchMethodException\\|ClassNotFoundException\"\n```\n\n## 7. Common Pitfalls\n\n- **New module = three lists**: `GraalVMOAPServerStartUp` registration, `provider-inventory.properties`, AND\n  `build-tools\u002Fbuild-common\u002F...\u002FAcceptedModules.java`. The config-generator discovers providers only through\n  `AcceptedModules`, so a module missing there gets no `copyTo\u003CConfig>` branch in `YamlConfigLoaderUtils` and the\n  OAP dies at boot with `Unknown config type` — after the JVM unit tests passed.\n- **Always `.\u002Fmvnw clean install` before a native build after a submodule bump**: a resumed build\n  (`-rf :precompiler`, no clean) reuses the old `oap-libs-for-graalvm\u002F*\u002Ftarget\u002F*.jar`, and\n  maven-shade merges that stale shaded jar with the fresh upstream jar; the stale copy wins, JVM\n  unit tests still pass, and the native OAP dies at boot with `NoClassDefFoundError` on a moved class.\n- **Same-name MAL counter windows**: since 11.0.0 `CounterWindow` is keyed by sample name, not\n  metric name, so the comparison harness runs the fresh and pre-compiled paths back to back with a\n  `CounterWindow.INSTANCE.reset()` in between.\n- **Diff the public API of every same-FQCN replacement, not only the constructors**: a Lombok\n  `@Getter` upstream adds a method the replacement must keep (11.0.0: `FilterExpression#getLiteral()`,\n  read by `Analyzer` only inside the debug-gated filter probe). The comparison tests never take that\n  branch, so the miss surfaces as `NoSuchMethodError` on the ingestion thread the moment an operator\n  starts a session. `FilteredRuleDebugCaptureTest` covers the MAL filter probe; add the equivalent\n  when a new probe reads a replaced class.\n- **Protobuf `JsonFormat` needs reflection metadata**: it prints\u002Fparses generated messages through\n  the accessor table, which looks getters up with `Class.getMethod`. The precompiler registers the\n  descriptor closure of every LAL input type plus the OTLP\u002FHTTP JSON receivers' `Export*ServiceRequest`\n  and `LogData` (`protoJsonRoots` → `addProtoMessageEntries`); when upstream starts JSON-parsing or\n  printing another generated type (`git grep \"JsonFormat\\.(parser|printer)\"`), extend the root set or\n  the native image answers `Generated message class ... missing method ...` (11.1: the ai-agent\n  case's OTLP\u002FJSON log posts exposed the missing OTLP roots).\n- **`LALOutputBuilder` implementations are a hand list**: the precompiler resolves `outputType` short\n  names through the SPI at build time, but their reflection entries sit in `Precompiler`'s\n  `configPojos` list. A new builder (11.1: `ConversationFile` from `ai-agent-conversation`) goes on\n  that list, and its module must be a precompiler dependency or the LAL rule fails to compile.\n- **Explicit-input MAL tests go stale when upstream adds a rule to an existing file**: `OapTest`-style\n  tests (hand-built `buildInput`) fail with \"both paths returned EMPTY\" on the new rule until its\n  sample family is added to the input; auto-discovery tests pick new rules up by themselves.\n- **Classpath resources must be globbed into the native image**: `oap-graalvm-native`'s\n  `reachability-metadata.json` lists the resources the binary embeds. JVM unit tests never notice a\n  missing one; the native OAP dies at boot (11.1: `classpath:query-protocol\u002Fgen-ai-evaluation-record.graphqls`,\n  now covered by the `query-protocol\u002F*.graphqls` glob). When upstream starts reading a new\n  classpath resource (not a `config\u002F` file), add a glob there and boot the native image.\n- **Armeria instantiates handler-referenced classes reflectively**: `@ExceptionHandler`,\n  `@RequestConverter` and `@Decorator` targets need constructor metadata. The precompiler's\n  `scanArmeriaHandlers` collects all three (11.1 added `@Decorator` for the AI agent conversation\n  view's `CompressResponse`; without it the native OAP dies at boot with \"cannot inject the\n  dependency for ...\"). A new Armeria annotation that names a class needs the same treatment.\n- **Jackson response POJOs need reflection metadata**: Armeria `HttpResponse.ofJson(pojo)` \u002F\n  `@ProducesJson` serialize through Jackson, which finds no properties in the native image without\n  metadata and answers HTTP 400 (\"No serializer found for class ...\"). The precompiler's\n  `scanQueryEntityClasses` covers `org.apache.skywalking.oap.query.*.entity.*` and\n  `org.apache.skywalking.oap.server.admin.*.response.*` (the latter added in 11.1 after the storage\n  suite's `admin inspect` cases exposed it); a POJO outside those packages must be registered by hand.\n  The same holds for request bodies (`@ConsumesJson`) and for Gson-printed answers, which silently come out as\n  `{}` instead of failing. 11.1 found three that no e2e case reached: `\u002Fstatus\u002Fcluster\u002Fnodes` (core `Address`,\n  HTTP 500), `\u002Fstatus\u002Falarm\u002F*` (`core.alarm.provider.status`, `{}`) and the AWS Firehose receiver (`FirehoseReq`,\n  HTTP 400 on every post). Audit with `git grep -n \"@ProducesJson\\|@ConsumesJson\\|ofJson(\\|GSON.toJson\"` over\n  the handlers (and `@RequestObject` parameters) and boot the native image against each route.\n- **Stale upstream build output hides missing metadata**: `make init-skywalking` does not clean, so a resource\n  upstream deleted survives in `skywalking\u002F**\u002Ftarget\u002Fclasses` and the installed jars, and the precompiler still\n  scans it. 11.0.0 deleted `query-protocol\u002Fui-configuration.graphqls`; a local tree kept it, so the GraphQL type\n  scan kept registering `DashboardSetting` and `ui-management` passed locally while CI's clean build failed it.\n  Compare the precompiler's `Scanned GraphQL types: N matched from M schema types` and `Generated reflect-config.json\n  with N entries` lines with CI's, and clean-install any upstream module whose `target\u002Fclasses` holds files its\n  `src\u002Fmain\u002Fresources` no longer has.\n- **Native OAP boots faster than upstream assumes**: a case whose BanyanDB has no healthcheck\n  (`service_started` only, e.g. the distroless `-plugins` image) lets the native OAP connect before\n  BanyanDB listens, and it exits on `UNAVAILABLE`. Wrap the OAP entrypoint in `until nc -z ...`.\n- **Upstream e2e cases that bind-mount `java-test-service` jars**: don't build them in CI; every module\n  is published as `ghcr.io\u002Fapache\u002Fskywalking\u002F\u003Cmodule>:${SW_E2E_SERVICE_COMMIT}` with the jar at\n  `\u002Fapp.jar` — run the image directly, or copy the jar out through an init container when an agent\n  image must run it (`virtual-genai` spring-ai-service, `banyandb-trace-sampling` trace-mocker).\n\n- **A DSL that creates metrics needs both `MeterSystem` replacements to track upstream's API**: the\n  precompiler's build-time `MeterSystem` (`build-tools\u002Fprecompiler\u002F...`) and the runtime one\n  (`server-core-for-graalvm`). 11.1 TAL calls `createMetrics` → `MeterSystem#limitLabels`, which\n  neither replacement had; the build-time call fails the precompiler, the runtime one fails boot. TAL\n  creates its metrics through the shared build-time `MeterSystem`, so its meter classes land in\n  `tal-meter-classes.txt`, and the runtime `TalDSL` replays `create` + `limitLabels` from the manifest.\n- **Retire a replacement when upstream removes the reason for it**: 11.1 `HttpAlarmCallback` moved its\n  `HttpClient` from a static field to a constructor argument; keeping the old lazy-static replacement\n  would have dropped the constructor every hook subclass calls. Diff each changed replacement's upstream\n  source against the *reason* in its header, not only its API.\n- **Stream data registered by hand needs constructor metadata**: `IWorkerInstanceSetter.put(..., Class)`\n  of a non-`@Stream` class (11.1: TAL `PairingFact`) is rebuilt by `RemoteHandleWorker` with\n  `newInstance()` on the receiving OAP node. The StorageBuilders scan misses it, and only a cluster\n  shows the failure. Add a constructor entry in `Precompiler.generateReflectConfig`.\n- **Jackson YAML\u002FJSON DTOs outside `*.entity.*` \u002F `*.response.*`**: the status module's `\u002Fdebugging\u002F*`\n  bodies (`Debugging*Rsp`) are serialized by Jackson; the entity scan covers them since 11.1. A new\n  handler that returns POJOs from another package must be added to `scanQueryEntityClasses`.\n- **Upstream default switches can silently empty an e2e case**: 11.1 made native OTLP span storage the\n  default, so `otlp-traces` (Zipkin API assertions) needs `SW_OTEL_TRACE_STORAGE: zipkin`.\n\n- **Diff upstream `server-starter`'s dependencies against the distro poms on every sync**: a module that\n  ships only SPI implementations, no `ModuleDefine`, is invisible to `ImmigrationScopeTest`. `ios-analyzer`\n  (iOS `SpanListener`s, 11.0.0) was never bundled, and the iOS MAL\u002FLAL rules kept the gap hidden until the\n  `ios` e2e case was adopted in 11.1. Anything missing must be policy-excluded (cluster\u002Fconfiguration\u002Fstorage\n  plugins, `runtime-rule`) or added.\n- **TAL rules are user-editable**: keep the precompiler pass and the `TalDSL` \u002F `TALConfigs` replacements free of\n  shipped-rule assumptions. `TALPrecompileTest` (fixtures) and `TALDocScriptsTest` (upstream's documented scripts,\n  extracted from the docs and spliced where the practices page says) guard that; when upstream's docs move a\n  snippet or the shipped rule loses an anchor line, the test names it.\n\n- **Reflection errors at native image runtime**: New classes instantiated via `Class.forName().newInstance()` need entries in `reflect-config.json` or `reachability-metadata.json`\n- **Config loading failures**: New `ModuleConfig` subclasses need config-generator regeneration AND may need `@Setter` same-FQCN replacement\n- **Missing config files**: Runtime config files (non-DSL) must be in distribution assembly descriptors\n- **OAL builder registration**: OAL-generated builder classes need constructor entries in `reachability-metadata.json`\n- **Config-generator runs against upstream classpath**: Setter checks see upstream classes (no `@Setter`), not our for-graalvm replacements — the generator trusts that for-graalvm modules will provide setters",{"name":5,"description":7},"main","68ffde735c2406597075542c30dc709d8b478398",".claude\u002Fskills\u002Fsync-submodule",1,"https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-graalvm-distro","https:\u002F\u002Fskywalking.apache.org\u002F","https:\u002F\u002Fgithub.com\u002Fapache","https:\u002F\u002Fwww.apache.org\u002F","2026-11-10 16:38:50",{"source":8,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add apache\u002Fskywalking-graalvm-distro --skill sync-submodule",{"tool":43,"command":44},"bunx","bunx skills add apache\u002Fskywalking-graalvm-distro --skill sync-submodule",{"tool":46,"command":47},"pnpm","pnpm dlx skills add apache\u002Fskywalking-graalvm-distro --skill sync-submodule","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-graalvm-distro\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsync-submodule\u002FSKILL.md",true,[51,57,61,65,69,73,77,81,85,89,93],{"path":52,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":55,"sourceHtmlUrl":56},"references\u002F01-prerequisites.md","REFERENCE","参考文档",1958,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F01-prerequisites.md",{"path":58,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":59,"sourceHtmlUrl":60},"references\u002F02-starters-and-removed-features.md",9783,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F02-starters-and-removed-features.md",{"path":62,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":63,"sourceHtmlUrl":64},"references\u002F03-jackson-3.md",4292,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F03-jackson-3.md",{"path":66,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":67,"sourceHtmlUrl":68},"references\u002F04-core-framework.md",4338,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F04-core-framework.md",{"path":70,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":71,"sourceHtmlUrl":72},"references\u002F05-build-and-dependencies.md",6366,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F05-build-and-dependencies.md",{"path":74,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002F06-configuration-properties.md",3047,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F06-configuration-properties.md",{"path":78,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002F07-web-and-messaging.md",7450,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F07-web-and-messaging.md",{"path":82,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002F08-testing.md",6193,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F08-testing.md",{"path":86,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002F09-actuator-and-observability.md",2757,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F09-actuator-and-observability.md",{"path":90,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002F10-kotlin-and-java-build-config.md",1301,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F10-kotlin-and-java-build-config.md",{"path":94,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002F11-checklist-pitfalls-resources.md",6036,"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fawesome-copilot\u002Fblob\u002Fmain\u002Fskills\u002Fspring-boot-4-migration\u002Freferences\u002F11-checklist-pitfalls-resources.md",[98,117],{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":109,"publishedAt":23},"01M6ACRRJT0BYX479VKY2ECJX0","gh-pull-request","Verify, commit, and push changes on a PR branch. Runs pre-flight checks (compile, checkstyle, license headers) before every push. Also creates the PR if one doesn't exist yet.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-graalvm-distro\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgh-pull-request\u002FSKILL.md",[104],{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[110,111,112,21,113,114,115,116],"pull request","pull","gh pull request","pr","push","compile","license",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":134,"publishedAt":23},"01M6ACRPBR8C293HHA1SE06160","ci-e2e-debug","Download and inspect CI e2e test logs from GitHub Actions artifacts. Use when investigating e2e test failures in CI.","https:\u002F\u002Fgithub.com\u002Fapache\u002Fskywalking-graalvm-distro\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fci-e2e-debug\u002FSKILL.md",[123,126,129],{"categoryNo":124,"categoryName":125,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":127,"categoryName":128,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":130,"categoryName":131,"taxonomyType":132,"taxonomyTypeDesc":133},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[135,136,137,138,139,140],"debug","ci e2e debug","github","test","run","artifacts"]