From 4c3945aa3866e2900126cbddd944eb59c182d77c Mon Sep 17 00:00:00 2001 From: Ikhun Um Date: Fri, 3 Apr 2026 19:39:45 +0900 Subject: [PATCH 1/4] Add release-note skill and release notes for 1.38.0 - Add .claude/skills/release-note/ skill that automates generating and polishing release notes from a GitHub milestone - Add references/style-guide.md with annotated formatting examples - Add release notes for Armeria 1.38.0 Co-Authored-By: Claude Opus 4.6 --- .claude/skills/release-note/SKILL.md | 207 ++++++++++++++++++ .../release-note/references/style-guide.md | 177 +++++++++++++++ site-new/src/content/release-notes/1.38.0.mdx | 139 ++++++++++++ 3 files changed, 523 insertions(+) create mode 100644 .claude/skills/release-note/SKILL.md create mode 100644 .claude/skills/release-note/references/style-guide.md create mode 100644 site-new/src/content/release-notes/1.38.0.mdx diff --git a/.claude/skills/release-note/SKILL.md b/.claude/skills/release-note/SKILL.md new file mode 100644 index 00000000000..7670fed3a31 --- /dev/null +++ b/.claude/skills/release-note/SKILL.md @@ -0,0 +1,207 @@ +--- +name: release-note +description: Generate and polish release notes for an Armeria version. Runs site-new/release-note.ts to collect PR data from a GitHub milestone, then rewrites the skeletal output into publication-ready MDX. Invoked as `/release-note ` (e.g., `/release-note 1.38.0`). +--- + +# Release Note Generator + +Generates skeletal release notes from a GitHub milestone using `site-new/release-note.ts`, +then rewrites them into polished, publication-ready MDX with rich descriptions, code examples, +and proper formatting. + +## Prerequisites + +- The `gh` CLI must be authenticated with access to `line/armeria`. Verify with `gh auth status`. +- A `GITHUB_ACCESS_TOKEN` environment variable is recommended for higher GitHub API rate limits. + If not set, the script falls back to anonymous access (lower rate limits). +- Node.js and npm must be available. The `site-new/` directory must have dependencies installed + (`npm install` in `site-new/`). + +## Invocation + +``` +/release-note +``` + +Example: `/release-note 1.38.0` + +--- + +## Phase 0: Generate Skeletal Release Notes + +1. Verify the GitHub milestone exists for the given version by checking: + ``` + gh api repos/line/armeria/milestones --jq '.[] | select(.title == "") | .number' + ``` +2. Run the release note generation script: + ``` + cd site-new && npm run release-note + ``` +3. Verify the output file was created at `site-new/src/content/release-notes/.mdx`. +4. If the script fails (e.g., milestone not found, network error), report the error and stop. + +## Phase 1: Load Draft and Study Style + +1. Read the generated draft file at `site-new/src/content/release-notes/.mdx`. +2. Read 3-4 recent polished release notes (e.g., `1.36.0.mdx`, `1.37.0.mdx`) to calibrate tone and style. +3. Read the style guide at `references/style-guide.md` for formatting rules. +4. Extract all PR/issue references (`#NNNN`) from every line of the draft. + +## Phase 2: Gather PR Context from GitHub + +For each unique PR number found in the draft: + +1. Fetch PR details: + ``` + gh pr view --repo line/armeria --json title,body,labels,files + ``` +2. Parse the PR body to extract **Motivation**, **Modifications**, and **Result** sections. +3. Fetch PR review comments — these often contain important design decisions, caveats, and + scope limitations (e.g., "this only applies to unary calls") that are not in the PR description: + ``` + gh api repos/line/armeria/pulls//comments --jq '.[].body' + ``` +4. Extract linked issue numbers from the body (`Closes #NNNN`, `Fixes #NNNN`, `Resolves #NNNN`). +5. For each linked issue, fetch its context **including comments**, which often contain use cases, + edge cases, and design discussions that inform the release note description: + ``` + gh issue view --repo line/armeria --json title,body + gh api repos/line/armeria/issues//comments --jq '.[].body' + ``` +6. For PRs in the "New features" section that introduce significant new API: + - Read key changed source files from the PR's `files` list to understand method signatures. + - Look for usage examples in the PR description's Result section first — prefer these over + constructing examples from scratch. + - Check review comments for scope limitations, caveats, or known constraints that should be + mentioned in the release note (e.g., "only supports unary methods", "HTTP/2 only"). + +**Rate limiting**: If fetching many PRs, batch requests and pause briefly between them to avoid +GitHub API rate limits. + +## Phase 3: Triage "Maybe Ignore" Section + +The script puts PRs without a recognized label into `🗑 Maybe ignore`. For each entry: + +1. Check the PR's labels and description. +2. **Drop** items that are purely internal (CI config, build scripts, test infrastructure, + non-user-facing refactoring, site/docs dependency bumps). +3. **Relocate** user-facing items to the correct section based on their actual impact: + - API additions → New features + - Performance or usability improvements → Improvements + - Bug fixes → Bug fixes + - Breaking API changes → Breaking changes +4. Report triage decisions to the user so they can override if needed. + +## Phase 4: Rewrite Each Section + +Rewrite every entry following the formatting rules in `references/style-guide.md`. + +### Ordering + +1. **Lead with user interest**: Place the top 3 entries that users would care about most first. + Prioritize broadly applicable features (core, gRPC, Kubernetes) over niche modules (Athenz, xDS). + Consider the size of the user base affected and how common the use case is. +2. **Then group by module**: After the top 3, group remaining entries by module/area so that + related changes appear together (e.g., Athenz entries adjacent, Kubernetes entries adjacent). +3. This applies to all sections (New features, Improvements, Bug fixes, etc.). + +### Key principles: + +### New Features (`🌟 New features`) + +- All new feature entries get a bold title prefix: `- **Feature Title**: Description. #NNNN` +- **Keep descriptions concise** — most entries should fit within 3 lines of prose. + Only high-impact features (e.g., a brand-new module or paradigm-shifting API) warrant + longer descriptions. +- Include a Java code example (5-15 lines) whenever possible. It may be omitted if there is + no clear usage pattern to show. + - Mark the most important line with `// 👈👈👈` + - Indent code blocks with 2 spaces under the bullet. + +### Improvements (`📈 Improvements`) + +- Concise description of what improved and why it matters. +- Code examples only if the improvement changes how users interact with an API. + +### Bug Fixes (`🛠️ Bug fixes`) + +- Describe the symptom that was fixed, not the internal cause. +- Format: "[What was broken] now [works correctly]. #NNNN" + +### Breaking Changes (`☢️ Breaking changes`) + +- State clearly what changed and what users must do to migrate. +- Include before/after code if the migration is non-trivial. + +### Documentation (`📃 Documentation`) + +- Brief description with links to the new/updated docs if available. + +### Deprecations (`🏚️ Deprecations`) + +- State what is deprecated and what to use instead. + +### All Sections — Common Rules + +- Use `[ClassName](type)` for Armeria API types (classes, interfaces, annotations, methods). + - For classes/interfaces: `[GrpcServiceBuilder](type)` + - For methods: `[GrpcServiceBuilder#enableEnvoyHttp1Bridge(boolean)](type)` — always include the + class name, method name, and parameter types. Do NOT use backtick-only style like + `` `enableEnvoyHttp1Bridge(true)` `` for Armeria public API references in prose. + - Do NOT use this syntax for JDK types (`String`, `Duration`, `CompletableFuture`), third-party + types, or types that are not part of Armeria's public API. +- PR/issue references go at the end of the entry: `#6640 #6607` +- Do NOT copy PR titles verbatim — they are often terse commit-style messages. +- Do NOT fabricate code examples. Derive them from PR descriptions or actual source code. +- Keep entries self-contained — a reader should understand the change without clicking the PR link. + +## Phase 5: Clean Up Dependencies Section + +The raw script includes the full dependency update PR body, which uses a structured commit message format. + +1. **Strip build-only dependencies**: Remove the `- Build` section and all its sub-bullets + (these are testImplementation, annotationProcessor, and other non-production deps). +2. **Format each entry**: `- LibraryName oldVersion → newVersion` + - Use the library's common name (e.g., `Jackson`, `Netty`, `gRPC-Java`, not the Maven artifact ID). + - Use `→` (unicode arrow), not `->`. +3. **Group multi-version bumps** on one line when a library has multiple version streams: + `- Spring 6.2.14 → 6.2.15, 7.0.2 → 7.0.3` +4. **Sort alphabetically** (A → Z). + +## Phase 6: Finalize + +1. **Remove empty sections**: Delete any section whose only content is `- N/A`. +2. **Remove "Maybe ignore"**: The `🗑 Maybe ignore` section must not appear in the final output. +3. **Deduplicate and sort contributors**: Ensure `` has + alphabetically sorted, deduplicated usernames. Remove bot accounts (`dependabot[bot]`, + `CLAassistant`). +4. **Ensure consistent bullet style**: Use `-` (dash) for all bullets, not `*`. +5. **Write the final file** to `site-new/src/content/release-notes/.mdx`. +6. **Show a summary** to the user: list the sections, entry count per section, and any entries + flagged as uncertain (where PR context was insufficient to write a confident description). + +--- + +## Execution Checklist + +- [ ] Phase 0 — Ran `npm run release-note ` and verified output file exists +- [ ] Phase 1 — Read draft, recent examples, and style guide +- [ ] Phase 2 — Fetched PR/issue context for all referenced PRs +- [ ] Phase 3 — Triaged all "Maybe ignore" entries +- [ ] Phase 4 — Rewrote all entries per style guide +- [ ] Phase 5 — Cleaned up dependencies section +- [ ] Phase 6 — Removed empty sections, finalized file, reported summary + +## Common Mistakes to Avoid + +- **Copying PR titles as-is**: PR titles like "Fix NPE in FooBar" are not user-friendly. + Rewrite as "Fixed a `NullPointerException` in [FooBar](type) when ..." +- **Fabricating code examples**: If you cannot find a clear usage pattern from the PR description + or source code, write a descriptive sentence instead of guessing at code. +- **Over-linking types**: Only use `[Name](type)` for Armeria's own public API types, not for + JDK classes, third-party libraries, or internal classes. +- **Including build dependencies**: The dependency update PR body contains `- Build` sub-bullets + for test/build-only deps. These must be stripped. +- **Leaving `- N/A` sections**: The polished output should only contain sections with actual content. +- **Using `*` bullets**: Standardize on `-` dashes for all bullet points. +- **Missing `👈👈👈` callouts**: Every code example for a new feature should highlight the key line. diff --git a/.claude/skills/release-note/references/style-guide.md b/.claude/skills/release-note/references/style-guide.md new file mode 100644 index 00000000000..edb8184b294 --- /dev/null +++ b/.claude/skills/release-note/references/style-guide.md @@ -0,0 +1,177 @@ +# Release Notes Style Guide + +Annotated examples from real Armeria release notes showing the exact formatting conventions. + +--- + +## Major New Feature Entry + +Bold title, description explaining value, `[Type](type)` links, code example with `👈👈👈`, PR refs. + +```mdx +- **Standalone Athenz Token Validation**: You can now use [AthenzAuthorizer](type) to validate Athenz tokens + outside of Armeria's request pipeline. This allows you to easily integrate Athenz authorization into + third-party frameworks like Spring MVC or other servlet-based applications. #6607 + ```java + ZtsBaseClient ztsBaseClient = ...; + AthenzAuthorizer authorizer = + AthenzAuthorizer.builder(ztsBaseClient) + .policyConfig(new AthenzPolicyConfig("your-domain")) + .build(); + + // Validate tokens anywhere + AccessCheckStatus status = + authorizer.authorize(token, resource, action); // 👈👈👈 + ``` +``` + +Key elements: +- `**Bold Title**:` prefix — only for significant features, not every entry +- Description explains *what you can now do* and *why it matters* +- `[AthenzAuthorizer](type)` — Armeria API type link +- Code block indented under the bullet (2 spaces) +- `// 👈👈👈` on the line the reader should focus on +- `#6607` PR reference at end of description line + +--- + +## Minor New Feature Entry + +One-liner without code example, for smaller additions. + +```mdx +- **Per-Request Client TLS Configuration**: You can now specify [ClientTlsSpec](type) for each request using + [RequestOptions#clientTlsSpec()](type) or [ClientRequestContext#clientTlsSpec()](type). #6551 +``` + +Or even simpler: + +```mdx +- [ConnectionPoolListener](type) now supports ping-related events. #6539 #6552 +``` + +--- + +## Improvement Entry + +Concise description with type links. No code example unless it changes user-facing API. + +```mdx +- [XdsBootstrap](type) now supports SDS. #6597 #6610 #6654 +- Improved warning logs by adding diagnostic context to frequent HTTP/2 connection errors. #6638 +``` + +--- + +## Bug Fix Entry + +Describe the symptom that was fixed, not the internal root cause. + +```mdx +- [GrpcMeterIdPrefixFunction](type) records `grpc-status` correctly for responses which fail with an exception. #6606 #6621 +- `X-Forwarded-For` header values with leading or trailing whitespace around comma-separated addresses + (e.g., `"192.168.1.1 , 10.0.0.1"`) are now trimmed and parsed correctly. #6615 +- Setting `pingIntervalMillis` to a value greater than 33 seconds no longer throws an exception. #6648 + - Linux keepalive socket options (`SO_KEEPALIVE` `TCP_KEEPIDLE`, `TCP_KEEPINTVL`) are no longer set by default. +``` + +Key patterns: +- "[Thing] now [works correctly]" or "[Thing] no longer [does wrong thing]" +- Sub-bullets for related side effects or additional context +- Use backticks for config names, error types, and header names + +--- + +## Breaking Change Entry + +State what changed and what users must do to migrate. + +```mdx +- A subclass of [AbstractEndpointSelector](type) must implement [AbstractEndpointSelector#doSelectNow(ClientRequestContext)](type) + instead of [AbstractEndpointSelector#selectNow(ClientRequestContext)](type), which is now a final method. #6535 +``` + +For non-trivial migrations, include before/after code. + +--- + +## Documentation Entry + +Brief description with links to new/updated docs. + +```mdx +- New comprehensive documentation on understanding and handling timeouts: #6592 + - [Understanding timeout and cancellation origins](https://armeria.dev/docs/advanced/understanding-timeouts) + - Handling timeouts for streaming: + - [Client-side streaming](https://armeria.dev/docs/client/timeouts#handling-timeouts-for-streaming-responses) + - [Server-side streaming](https://armeria.dev/docs/server/timeouts#handling-timeouts-for-streaming-requests) +``` + +--- + +## Dependencies Section + +Format: `- LibraryName oldVersion → newVersion`, sorted alphabetically. + +```mdx +- Athenz 1.12.31 → 1.12.33 +- BlockHound 1.0.15 → 1.0.16 +- Jackson 2.20.1 → 2.21.0 +- Kotlin 2.2.21 → 2.3.0 +- Logback 1.5.23 → 1.5.27 +- Spring 6.2.14 → 6.2.15, 7.0.2 → 7.0.3 +- Spring Boot 3.5.8 → 3.5.10, 4.0.1 → 4.0.2 +``` + +Rules: +- Use `→` (unicode arrow), not `->` or `-->` +- Use `-` dash bullets, not `*` +- Use the library's common name, not Maven artifact IDs +- Group multi-version bumps: `- Spring 6.2.14 → 6.2.15, 7.0.2 → 7.0.3` +- Omit build-only dependencies (anything under the `- Build` section in the raw dependency PR) +- Sort alphabetically (A → Z) + +--- + +## Thank You Section + +```mdx +## 🙇 Thank you + + +``` + +Rules: +- Usernames sorted alphabetically +- Remove bot accounts: `dependabot[bot]`, `CLAassistant` +- One username per line, single-quoted, comma-separated + +--- + +## What NOT to Include + +- **`- N/A` entries**: Remove sections that have no content instead of writing `- N/A` +- **`🗑 Maybe ignore` section**: Must be fully triaged and removed +- **Build-only dependencies**: `- Build` sub-section from dependency PRs +- **Internal refactoring details**: Changes with no user-facing impact +- **Site/docs dependency bumps**: npm bumps for `site-new/` or `docs-client/` (e.g., webpack, lodash) + +## Type Link Rules + +Use `[ClassName](type)` ONLY for Armeria public API references: +- Classes/interfaces: `[GrpcServiceBuilder](type)` +- Methods: `[GrpcServiceBuilder#enableEnvoyHttp1Bridge(boolean)](type)` — always use the full + `ClassName#methodName(ParamType)` form. Never use backtick-only style like + `` `enableEnvoyHttp1Bridge(true)` `` for Armeria public API references in prose. +- Annotations: `[@Blocking](type)` + +Do NOT use `[Name](type)` for: +- JDK types (`String`, `Duration`, `CompletableFuture`, `List`) +- Third-party types (`Mono`, `Flux`, `HttpServletRequest`) +- Internal/private Armeria classes +- Generic concepts (use plain text or backticks instead) +- Method calls inside code blocks — code blocks use plain Java syntax, not `(type)` links diff --git a/site-new/src/content/release-notes/1.38.0.mdx b/site-new/src/content/release-notes/1.38.0.mdx new file mode 100644 index 00000000000..2e9221e4a52 --- /dev/null +++ b/site-new/src/content/release-notes/1.38.0.mdx @@ -0,0 +1,139 @@ +--- +date: 2026-04-03 +--- + +# v1.38.0 + +## 🌟 New features + +- **HTTP/JSON to gRPC Proxy**: You can now use [DelegatingHttpJsonTranscodingService](type) to accept + HTTP/JSON traffic and forward it as gRPC to any [HttpService](type) delegate, without needing a + local gRPC service implementation. #6669 + ```java + WebClient client = ...; + HttpService delegate = (ctx, req) -> client.execute(req); + DelegatingHttpJsonTranscodingService service = + DelegatingHttpJsonTranscodingService + .builder(delegate) + .serviceDescriptors(MyServiceGrpc.getServiceDescriptor()) // 👈👈👈 + .build(); + ``` +- **KubernetesEndpointGroup POD Mode**: [KubernetesEndpointGroup](type) now supports `POD` mode for + intra-cluster communication, connecting directly to `podIP:containerPort` for true client-side + load balancing. #6600 #6661 + ```java + KubernetesEndpointGroup endpointGroup = + KubernetesEndpointGroup.builder(kubernetesClient) + .namespace("my-namespace") + .serviceName("my-service") + .mode(KubernetesEndpointMode.POD) // 👈👈👈 + .build(); + ``` +- **Envoy gRPC HTTP/1.1 Bridge**: [GrpcService](type) now supports the Envoy gRPC HTTP/1.1 bridge + specification via [GrpcServiceBuilder#enableEnvoyHttp1Bridge(boolean)](type). When enabled, unary + gRPC responses over HTTP/1.1 merge `grpc-status` and trailers into response headers, improving + compatibility with legacy proxy servers. This applies only to unary methods; streaming methods + are unaffected. #6664 #6689 + ```java + GrpcService.builder() + .addService(myGrpcService) + .enableEnvoyHttp1Bridge(true) // 👈👈👈 + .build(); + ``` +- **Kubernetes Node IP Extractor**: [KubernetesEndpointGroup](type) can now extract a Node IP from + labels or annotations via [KubernetesEndpointGroupBuilder#nodeIpExtractor(Function)](type), + useful for CNI-managed environments like Calico. #6660 +- **Additional BuiltInProperty Entries**: [BuiltInProperty](type) now includes 15 new properties for + timing, content preview, and protocol information, aligning it with [AccessLogComponent](type). + #4403 #6683 + - Timing: `req.start_time_millis`, `req.duration_millis`, `res.duration_millis`, + `total_duration_millis`, etc. + - Content preview: `req.content_preview`, `res.content_preview` + - Protocol: `serialization.format`, `session.protocol`, `host` +- **Token Preloading**: You can now set [AsyncLoaderBuilder#preload(boolean)](type) to eagerly fetch + tokens at build time, reducing first-request latency. [OAuth2AuthorizationGrantBuilder](type) and + [AthenzClientBuilder](type) also support this option. #6688 +- **Standalone Athenz Token Client**: You can now use [AthenzTokenClient](type) to fetch Athenz + tokens independently of Armeria's HTTP decorator pipeline. #6431 #6691 + ```java + AthenzTokenClient tokenClient = + AthenzTokenClient.builder(ztsBaseClient) + .domainName("my-domain") + .roleNames("my-role") + .build(); + tokenClient.getToken().thenAccept(token -> { // 👈👈👈 + // Use the token with any HTTP client. + }); + ``` +- **Athenz Metrics**: You can now monitor Athenz policy load success/failure rates and token cache + hit/miss metrics via a configurable `MeterRegistry` on [AthenzAuthorizer](type) and + [AthenzService](type) builders. #6690 +- **xDS SDS Integration**: xDS now supports transport-socket TLS with SAN and certificate pin + verification for upstream connections, and SDS integration with [XdsPreprocessor](type). #6628 + +## 📈 Improvements + +- [StreamDecoderFactory](type) now supports flexible content-encoding matching via + [StreamDecoderFactory#matchesEncodingHeaderValue(String)](type). This fixes interoperability with + frameworks like Netty that return `snappy` instead of `x-snappy-framed`. #6681 #6684 +- You can now bind a [VirtualHost](type) to a random (ephemeral) port using a [ServerPort](type) + object, useful for CI environments where port conflicts must be avoided. #6410 #6603 + ```java + ServerPort port1 = new ServerPort(0, SessionProtocol.HTTP); + ServerPort port2 = new ServerPort(0, SessionProtocol.HTTP); + Server server = Server.builder() + .port(port1) + .virtualHost(port1) // 👈👈👈 + .service("/foo", (ctx, req) -> HttpResponse.of("foo")) + .and() + .port(port2) + .virtualHost(port2) // 👈👈👈 + .service("/bar", (ctx, req) -> HttpResponse.of("bar")) + .and() + .build(); + ``` +- [DocService](type) now correctly generates JSON Schema with `oneOf` and `discriminator` fields for + types annotated with Jackson's `@JsonTypeInfo` and `@JsonSubTypes`. #6370 + +## 🛠️ Bug fixes + +- [RequestContextExportingAppender](type) no longer throws a `NullPointerException` during + [RequestContextStorage](type) initialization in Logback 1.5.21 and later. #6662 + +## ⛓ Dependencies + +- Athenz 1.12.35 → 1.12.37 +- Brave 6.3.0 → 6.3.1 +- Brotli4j 1.20.0 → 1.22.0 +- Envoy control plane 1.0.49 → 1.0.52 +- Eureka 2.0.5 → 2.0.6 +- gRPC-Java 1.78.0 → 1.80.0 +- Jackson 2.21.1 → 2.21.2 +- Kubernetes client 7.5.2 → 7.6.1 +- Micrometer 1.16.3 → 1.16.4 +- Micrometer Tracing 1.6.3 → 1.6.4 +- Netty 4.2.10.Final → 4.2.12.Final +- Prometheus 1.5.0 → 1.5.1 +- Protobuf 4.34.0 → 4.34.1 +- Reactor 3.8.3 → 3.8.4 +- Sangria 4.2.15 → 4.2.17 +- Spring Boot 4.0.3 → 4.0.5 +- Spring Framework 7.0.5 → 7.0.6 +- Testcontainers 2.0.3 → 2.0.4 +- ZooKeeper 3.9.4 → 3.9.5 + +## 🙇 Thank you + + From 7f4f3877cdc01afbea2705c653aaba5c63b29abf Mon Sep 17 00:00:00 2001 From: Ikhun Um Date: Fri, 3 Apr 2026 19:50:12 +0900 Subject: [PATCH 2/4] Update release-note skill and release notes - Always include core maintainers from CODEOWNERS in Thank You section - Clarify issue/PR reference format in style guide Co-Authored-By: Claude Opus 4.6 --- .claude/skills/release-note/SKILL.md | 5 +++-- .claude/skills/release-note/references/style-guide.md | 3 ++- site-new/src/content/release-notes/1.38.0.mdx | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.claude/skills/release-note/SKILL.md b/.claude/skills/release-note/SKILL.md index 7670fed3a31..bfa82932aba 100644 --- a/.claude/skills/release-note/SKILL.md +++ b/.claude/skills/release-note/SKILL.md @@ -150,7 +150,7 @@ Rewrite every entry following the formatting rules in `references/style-guide.md `` `enableEnvoyHttp1Bridge(true)` `` for Armeria public API references in prose. - Do NOT use this syntax for JDK types (`String`, `Duration`, `CompletableFuture`), third-party types, or types that are not part of Armeria's public API. -- PR/issue references go at the end of the entry: `#6640 #6607` +- Issue and PR references go at the end of the entry: `#6431 #6691` (list both the issue and the PR) - Do NOT copy PR titles verbatim — they are often terse commit-style messages. - Do NOT fabricate code examples. Derive them from PR descriptions or actual source code. - Keep entries self-contained — a reader should understand the change without clicking the PR link. @@ -174,7 +174,8 @@ The raw script includes the full dependency update PR body, which uses a structu 2. **Remove "Maybe ignore"**: The `🗑 Maybe ignore` section must not appear in the final output. 3. **Deduplicate and sort contributors**: Ensure `` has alphabetically sorted, deduplicated usernames. Remove bot accounts (`dependabot[bot]`, - `CLAassistant`). + `CLAassistant`). Core maintainers listed in `.github/CODEOWNERS` must always be included + in the Thank You section, even if they don't appear in the PR participant lists. 4. **Ensure consistent bullet style**: Use `-` (dash) for all bullets, not `*`. 5. **Write the final file** to `site-new/src/content/release-notes/.mdx`. 6. **Show a summary** to the user: list the sections, entry count per section, and any entries diff --git a/.claude/skills/release-note/references/style-guide.md b/.claude/skills/release-note/references/style-guide.md index edb8184b294..bedbf4483ce 100644 --- a/.claude/skills/release-note/references/style-guide.md +++ b/.claude/skills/release-note/references/style-guide.md @@ -31,7 +31,7 @@ Key elements: - `[AthenzAuthorizer](type)` — Armeria API type link - Code block indented under the bullet (2 spaces) - `// 👈👈👈` on the line the reader should focus on -- `#6607` PR reference at end of description line +- `#6607` issue/PR references at end of description line (list both the issue and the PR) --- @@ -148,6 +148,7 @@ Rules: Rules: - Usernames sorted alphabetically - Remove bot accounts: `dependabot[bot]`, `CLAassistant` +- Core maintainers from `.github/CODEOWNERS` must always be included - One username per line, single-quoted, comma-separated --- diff --git a/site-new/src/content/release-notes/1.38.0.mdx b/site-new/src/content/release-notes/1.38.0.mdx index 2e9221e4a52..aaa0d8f7bb4 100644 --- a/site-new/src/content/release-notes/1.38.0.mdx +++ b/site-new/src/content/release-notes/1.38.0.mdx @@ -135,5 +135,6 @@ date: 2026-04-03 'jrhee17', 'junjunclub', 'kwondh5217', - 'minwoox' + 'minwoox', + 'trustin' ]} /> From 4af07ca71829921319230bea6bf841a2a838a321 Mon Sep 17 00:00:00 2001 From: Ikhun Um Date: Mon, 6 Apr 2026 15:01:18 +0900 Subject: [PATCH 3/4] Apply suggestion from @ikhoon --- site-new/src/content/release-notes/1.38.0.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site-new/src/content/release-notes/1.38.0.mdx b/site-new/src/content/release-notes/1.38.0.mdx index aaa0d8f7bb4..c6bf504a76e 100644 --- a/site-new/src/content/release-notes/1.38.0.mdx +++ b/site-new/src/content/release-notes/1.38.0.mdx @@ -1,5 +1,5 @@ --- -date: 2026-04-03 +date: 2026-04-07 --- # v1.38.0 From 7ca5c3b0302fa057e6ebd78800d460ea530aa955 Mon Sep 17 00:00:00 2001 From: Ikhun Um Date: Mon, 6 Apr 2026 16:35:23 +0900 Subject: [PATCH 4/4] add link --- site-new/src/content/release-notes/1.38.0.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site-new/src/content/release-notes/1.38.0.mdx b/site-new/src/content/release-notes/1.38.0.mdx index c6bf504a76e..c7b082fe207 100644 --- a/site-new/src/content/release-notes/1.38.0.mdx +++ b/site-new/src/content/release-notes/1.38.0.mdx @@ -29,8 +29,8 @@ date: 2026-04-07 .mode(KubernetesEndpointMode.POD) // 👈👈👈 .build(); ``` -- **Envoy gRPC HTTP/1.1 Bridge**: [GrpcService](type) now supports the Envoy gRPC HTTP/1.1 bridge - specification via [GrpcServiceBuilder#enableEnvoyHttp1Bridge(boolean)](type). When enabled, unary +- **Envoy gRPC HTTP/1.1 Bridge**: [GrpcService](type) now supports the [Envoy gRPC HTTP/1.1 bridge specification](https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/grpc_http1_bridge_filter) + via [GrpcServiceBuilder#enableEnvoyHttp1Bridge(boolean)](type). When enabled, unary gRPC responses over HTTP/1.1 merge `grpc-status` and trailers into response headers, improving compatibility with legacy proxy servers. This applies only to unary methods; streaming methods are unaffected. #6664 #6689