membphis opened a new issue, #13359:
URL: https://github.com/apache/apisix/issues/13359
### Current State
The CHANGELOG for the `3.x` series (21 versions, ~1100 PRs spanning 2022-10
→ 2026-04) has systemic issues that go beyond individual PR omissions. The most
impactful problems fall into recurring patterns:
1. **Four patch tags are entirely missing from master `CHANGELOG.md`**
- `3.2.2`, `3.4.1`, `3.8.1`, `3.9.1` were tagged and released, with their
sections written on `release/X.Y` branches, but never cherry-picked back to
master.
- These sections contain real security-impact fixes that master readers
cannot see today, including jwt-auth authentication bypass (#9837) and
forward-auth POST header leak (#11184).
- `3.2.1` exists in master only as placeholder text ("This is an LTS
maintenance release...") with no actual bugfix entries.
2. **Silent rockspec dependency upgrades (15+ instances)**
Every minor release upgrades dependencies with user-visible behavior or
compatibility impact, but the CHANGELOG is silent. Most impactful examples:
- `3.15.0`: `lua-resty-session` 3.10 → 4.1.5 — default switches to
AES-256-GCM; **all session cookies issued by 3.14.x become invalid, forcing
every OIDC user to re-authenticate after upgrade**. Not mentioned.
- `3.15.0`: `lua-resty-openidc` 1.7.6 → 1.8.0; `net-url` 0.9 → 1.2 (major
bump).
- `3.16.0`: `api7-lua-resty-http` 0.2.2 → 0.2.3 (rejects control chars in
headers, affects every plugin using resty.http).
- `3.8.0`: `luasec` 0.9 → 1.3.2 (TLS library cross-major upgrade).
- `3.4.0`: `lua-resty-healthcheck-api7` 2.2.3 → 3.0.0 (major bump).
- `3.9.0`: `lua-resty-radixtree` 2.8.2 → 2.9.1 (route ordering fix #10861
hidden behind a `chore` title).
3. **Security fixes are not consistently flagged**
- jwt-auth auth bypass (#9837) appears in three release lines (3.2.2,
3.4.1, 3.5.0) and is flagged as security in none of them.
- OpenResty CVE upgrade in 3.10.0 (#11419) is listed without CVE
annotation.
- No `### Security` section convention exists today.
4. **Breaking changes mis-classified as Bugfixes / missing `:warning:`**
- `3.14.0` #12551: `X-Forwarded-*` trusted-source whitelist change (a
real breaking change) was placed under "Bugfixes".
- `3.12.0` #11993: `ssl_trusted_certificate` default changed from "not
configured = no verification" to "system CA bundle" — wording is one line, with
no upgrade impact note. OIDC and outbound HTTPS calls may newly fail TLS
handshake after upgrade.
- `3.11.0` #11601: `credential` resource silently dropped auth check and
injects 3 upstream headers — no `:warning:`.
- `3.10.0` #11343 / #11312: `config-default.yaml` physically removed;
YAML parser changed from tinyyaml → lyaml (stricter) — both can break IaC
templates and existing `apisix.yaml` on startup, no `:warning:`.
- `3.6.0` #10233: "Enforce strict schema validation" wording does not
mention that `additionalProperties=false` was added to route / service /
upstream / consumer / ssl / plugin_config / global_rule / stream_route / proto
— this is the single largest silent-upgrade source in 3.6.0.
5. **Wording from implementation side rather than user side**
- `3.7.0` OpenTelemetry #10393: span name changed from URI to `{method}
{route_name}` — breaks existing tracing dashboards. CHANGELOG only says
"replace route with apisix.route_name".
- `3.11.0` hmac-auth #11581: field rename (`access_key` → `key_id`), 4
fields removed, single `Authorization` header — every existing signing client
must change. CHANGELOG says "rewrite hmac-auth plugin for usability".
- `3.16.0` #12940 (`use apisix_request_id only in http subsystem log
format`): default `access_log_format` silently changes.
6. **Within-cycle intermediate changes not folded**
- `3.13.0` `server-info`: removed (#12218) → reverted (#12225) → marked
deprecated (#12244) within the same cycle — narrative is incomplete in
CHANGELOG.
- `3.9.0` `quic` → `http3` rename: 3 PRs, users should only see final
option `enable_http3`.
- `3.15.0` rate-limit redis keepalive field rename (#12861 → #12955).
7. **Same PR listed twice in Change and Bugfixes (same release)**
- `3.12.0`: #11993 / #11988 / #12013 / #12014 / #11852 appear in both
sections.
- `3.10.0`: #11127 / #11136 / #11140 appear in both Change (`:warning:`)
and Bugfix.
8. **Markdown / numbering / typos**
- `3.14.0` and `3.14.1`: `## Doc improvements` uses H2 (breaks TOC, looks
like a new release).
- `3.5.0`: PR `#9813` referenced — actual PR is `#9622`
(`google-cloud-logging` `client_email`).
- `3.11.0`: plugin name typo `attach-consmer-label`.
- `3.12.0` #11936: OpenResty version typo `v1.27.11` — actual `1.27.1.1`.
- `3.0.0`: `APSISIX` typo on the `enable_cpu_affinity` entry.
9. **Large omission batches in older versions**
- `3.13.0`: 10 user-visible PRs not listed, including the new
`ai-request-rewrite` plugin.
- `3.2.0`: ~17 user-facing PRs not listed; jwt-auth Vault entry says
"Deprecated" but the change is actually a removal (#8660).
- `3.1.0`: upstream `type` switched from required to optional (#8180),
`/etc/hosts` prioritized resolution (#8270), GM crypto plugin (#8389), etcd
IPv6 (#8245), DNS client switched to `api7-lua-resty-dns-client` fork — none
mentioned.
### Desired State
**A. Backfill missing patch sections into master `CHANGELOG.md`**
- Cherry-pick `3.2.2`, `3.4.1`, `3.8.1`, `3.9.1` sections from their
`release/X.Y` branches into master `CHANGELOG.md`. Add `### Security`
annotation for jwt-auth auth bypass (#9837) and forward-auth POST header leak
(#11184).
- Replace the `3.2.1` placeholder paragraph with the 5–6 real bugfixes from
`release/3.2` (including the missing `#9309` `proxy-rewrite` `ngx.var.uri` fix).
**B. Six release-process additions to prevent regression**
1. **Rockspec diff gate** — release pipeline runs `git diff <prev>..<this>
-- '*.rockspec'`; any non-patch dependency bump requires a corresponding
CHANGELOG entry. Closes the 15+ silent dep-bump pattern.
2. **Patch-release CHANGELOG cherry-pick rule** — any CHANGELOG entry
written on a `release/X.Y` branch must be paired with a cherry-pick PR back to
master. Prevents the four-tag pattern from recurring.
3. **Breaking-change scan gate** — scan `apisix/schema_def.lua`,
`apisix/admin/*.lua`, `apisix/plugins/*.lua` for changes touching `default |
required | enum | encrypt_fields | deprecated | remove | rename`; require a
`:warning:` CHANGELOG line for each. Covers #11993, #11601, #10233, #12551
patterns.
4. **PR-number cross-check** — `grep -oE '#[0-9]+' CHANGELOG.md | sort -u`
vs commit-derived PR list to catch transcription errors like `#9622` → `#9813`.
5. **Markdown lint** — every `## ` heading in CHANGELOG must match a release
version; `## Doc improvements` style mistakes flagged.
6. **`### Security` convention** — any CVE / auth-bypass /
privilege-escalation fix gets a dedicated subsection with `:warning:`, so
operators can quickly identify must-upgrade versions.
**C. Per-version revision lists**
Detailed per-PR evidence (CHANGELOG diff, `bug` label state, code path,
proposed rewording) is available offline and can be split into separate
revision PRs per version. Highest-priority near-term:
- `3.16.0`: 4 entries (missing #12961; `:warning:` rewrite for #13057 and
#13046; rewrite #13006 → Change).
- `3.15.0`: 9 entries (must `:warning:` #12862 `lua-resty-session` 4.x;
suggested `:warning:` for #12714, #12678; 3 missing fixes; 1 feat→fix
re-classification; single rockspec aggregate line).
- `3.14.0`: move #12551 from Bugfixes to Change with `:warning:` + add a
pre-upgrade `trusted_addresses` configuration hint.
- `3.12.0`: expand #11993 wording to "old default = no verification, new
default = system CA bundle"; fix #11936 OpenResty version typo.
Earlier versions (3.0.0 → 3.13.0) can be batched per still-maintained LTS
branch.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]