Skip to content

Commit fb2bfbd

Browse files
committed
enhance: update lts
1 parent 5c1b1bf commit fb2bfbd

1 file changed

Lines changed: 119 additions & 89 deletions

File tree

rfcs/0001-lts-release-policy.md

Lines changed: 119 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,43 @@ title: OpenClaw LTS Release Policy
33
authors:
44
- Kevin Lin
55
created: 2026-05-27
6-
last_updated: 2026-05-27
6+
last_updated: 2026-05-28
77
rfc_pr: TBD
88
---
99

1010
# Proposal: OpenClaw LTS Release Policy
1111

1212
## Summary
1313

14-
Add an opt-in OpenClaw LTS channel by designating selected already-shipped
15-
stable releases for longer support. Daily `stable` releases remain the default
16-
install and update path, while `lts` becomes a first-class package and update
17-
target backed by a fixed active LTS branch, the npm `lts` dist-tag, explicit
18-
support dates, narrow backport rules, and documented plugin compatibility.
14+
Add an opt-in OpenClaw support channel by designating selected monthly release
15+
lines for longer support. The fast/latest train remains the default install and
16+
update path, while `lts` becomes a first-class package and update target backed
17+
by support-line tags, explicit support dates, narrow backport rules, and
18+
documented plugin compatibility.
1919

2020
## Motivation
2121

22-
OpenClaw's daily stable cadence gives users fast access to fixes and
22+
OpenClaw's fast stable cadence gives users quick access to fixes and
2323
improvements, but some operators need a lower-churn supported line for
2424
production or enterprise deployments. Those users need predictable install
2525
commands, a bounded support window, explicit backport criteria, and a clear
2626
answer for whether core packages and plugins remain compatible.
2727

2828
The LTS policy should provide that stability without creating a second default
29-
release train. The daily stable release remains the proving ground. Maintainers
30-
select a stable release for LTS only after it has shipped, soaked, and produced
31-
the normal release evidence.
29+
release train. The fast/latest stable release remains the proving ground.
30+
Maintainers select a monthly line for support only after it has shipped, soaked,
31+
and produced the normal release evidence.
3232

3333
## Goals
3434

35-
- Preserve daily `stable` as the default install and update target.
35+
- Preserve the fast/latest `stable` train as the default install and update
36+
target.
3637
- Add `lts` as an explicit opt-in channel for package installs and
3738
`openclaw update`.
38-
- Designate LTS from already-shipped stable releases instead of building a
39-
separate release factory.
40-
- Reuse existing stable correction versions such as `YYYY.M.D-N`.
41-
- Maintain one active LTS line by default.
39+
- Use SemVer-compatible monthly lines: `YYYY.M.PATCH`.
40+
- Keep beta on the fast/latest train as prereleases such as
41+
`YYYY.M.PATCH-beta.N`.
42+
- Maintain one trailing monthly support line by default as the first step.
4243
- Define the LTS support window, eligible backports, validation bar, docs
4344
obligations, and end-of-life behavior.
4445
- Make bundled and explicitly-covered official plugin compatibility part of
@@ -47,39 +48,46 @@ the normal release evidence.
4748

4849
## Non-Goals
4950

50-
- Changing the daily stable release cadence.
51+
- Changing the default fast/latest release cadence.
5152
- Making LTS the default install target.
5253
- Introducing a new `-lts` version suffix or version family.
5354
- Guaranteeing support for every external plugin.
5455
- Backporting normal feature work, refactors, or broad compatibility churn.
55-
- Blocking daily stable releases on LTS maintenance work.
56+
- Blocking fast/latest stable releases on LTS maintenance work.
5657
- Defining a multi-line LTS program before maintainers intentionally expand
5758
support capacity.
5859

5960
## Proposal
6061

6162
### Policy model
6263

63-
OpenClaw LTS is a support designation applied to a selected stable release after
64-
that release ships through the normal release process. LTS is additive: it does
65-
not replace `stable`, `beta`, or `dev`, and it does not slow the daily stable
66-
train.
64+
OpenClaw LTS is a support designation applied to a selected monthly release
65+
line after that line ships through the normal release process. LTS is additive:
66+
it does not replace `stable`, `beta`, or `dev`, and it does not slow the
67+
fast/latest stable train.
6768

6869
The initial policy is:
6970

7071
- `stable` remains the default user-facing version and continues to track the
71-
newest daily stable release.
72-
- Maintainers may designate an already-shipped stable release as the active LTS
73-
base.
74-
- LTS maintenance releases keep the existing stable correction format
75-
`YYYY.M.D-N`.
76-
- OpenClaw supports at most one active LTS line at a time by default.
72+
newest stable release in the fast/latest train.
73+
- Maintainers may designate an already-shipped monthly line as the active LTS
74+
line.
75+
- Monthly-line releases use `YYYY.M.PATCH`. For example, `2026.6.0`,
76+
`2026.6.1`, and `2026.6.2` are all June 2026 line releases.
77+
- Patch numbers can grow as high as needed, so multiple releases on the same
78+
day are handled by incrementing `PATCH`.
79+
- Beta remains the fast/latest train prerelease channel, for example
80+
`2026.6.3-beta.1`.
81+
- Future support tags may point at monthly lines, for example `stable-2026-6`
82+
or `lts-2026-6`.
83+
- OpenClaw supports one trailing monthly support line by default as the first
84+
step, not a long LTS promise.
7785
- Users opt in through `openclaw update --channel lts`, `openclaw@lts`, or an
7886
installer option that resolves to the same LTS package target.
7987

8088
### LTS selection
8189

82-
Maintainers may designate a stable release as LTS only when all of the following
90+
Maintainers may designate a monthly line as LTS only when all of the following
8391
are true:
8492

8593
- The release already shipped as a normal stable release through the existing
@@ -91,20 +99,25 @@ are true:
9199
- The release has a published compatibility coverage table for bundled plugins
92100
and any official external plugins covered by the LTS promise.
93101
- The release has soaked long enough in the stable population for maintainers to
94-
judge it lower risk than the moving daily tip.
102+
judge it lower risk than the moving fast/latest tip.
95103

96104
This makes LTS a promotion decision on a stable artifact, not a parallel
97105
artifact-build process.
98106

99107
### Support window
100108

101-
Each LTS line receives six months of active support from designation. The final
102-
month is maintenance-only: new backports are limited to security fixes and
103-
critical install, update, or upgrade blockers.
109+
The first support-line step is intentionally short: one trailing monthly support
110+
line at a time. The support window should be long enough to build branch, patch,
111+
validation, docs, and update-channel muscle, without making a long LTS promise
112+
before the process has proven itself.
104113

105-
At end of life, users should move to either the current daily `stable` line or
106-
the next designated LTS line. Before the active LTS line reaches end of life,
107-
maintainers must retarget the active LTS selector to the next supported line.
114+
The policy can expand later toward quarterly or yearly support lines and 4-12
115+
month support windows after the monthly support-line process works.
116+
117+
At end of life, users should move to either the current fast/latest `stable`
118+
line or the next designated LTS line. Before the active LTS line reaches end of
119+
life, maintainers must retarget the active LTS selector to the next supported
120+
line.
108121

109122
### Eligible backports
110123

@@ -115,8 +128,8 @@ LTS backports are intentionally narrow. Eligible changes are:
115128
notarization, or registry publication working.
116129
- Critical regressions in core agent, gateway, update, or packaged install
117130
flows.
118-
- Upgrade blockers from the base LTS release or an earlier correction in the
119-
same LTS line.
131+
- Upgrade blockers from the base LTS release or an earlier patch in the same
132+
LTS line.
120133
- Bundled-plugin or explicitly-supported official-plugin compatibility fixes.
121134
- Release-blocking docs or operator guidance corrections where the current docs
122135
would cause normal install, upgrade, or recovery paths to fail.
@@ -133,37 +146,41 @@ Fixes land on `main` first, then are cherry-picked to the maintained LTS branch.
133146

134147
### Branch, tag, and publish mechanics
135148

136-
The normal daily stable process continues to cut `release/YYYY.M.D` branches
137-
from `main` and publish stable releases. LTS designation adds active-channel
138-
metadata and a maintenance branch around an already-published release.
149+
The normal fast/latest stable process publishes SemVer-compatible monthly-line
150+
versions from `main` using `YYYY.M.PATCH`. LTS designation adds active-channel
151+
metadata and a maintenance selector around an already-published monthly line.
139152

140153
The active LTS branch model is:
141154

142-
- Maintainers create `release/lts` from the selected stable release line.
143-
- `release/lts` is the canonical git-side selector for the active LTS line.
144-
- LTS corrections use existing stable correction tags such as `vYYYY.M.D-N`.
155+
- Maintainers create an active support branch or tag selector from the selected
156+
monthly line.
157+
- The active support branch or tag selector is the canonical git-side selector
158+
for the active LTS line.
159+
- LTS patches use normal patch increments within the monthly line, for example
160+
`2026.6.1` and `2026.6.2`.
145161
- `main` continues to move independently and is never gated by LTS maintenance.
146-
- When an LTS line retires, maintainers retarget `release/lts` to the next
147-
active LTS line and may preserve the retired line as
148-
`release/lts-{version}` for history.
162+
- When an LTS line retires, maintainers retarget the active support selector to
163+
the next active LTS line and may preserve the retired line for history.
149164

150165
The package publication model is:
151166

152167
- The initial LTS designation moves or adds npm dist-tag `lts` to the exact
153168
already-published stable version.
154169
- Designation does not rebuild or republish different bytes for the base
155170
stable release.
156-
- Later LTS correction releases move npm dist-tag `lts` forward to the newest
157-
supported correction in the same line.
171+
- Later LTS patch releases move npm dist-tag `lts` or a future line-specific
172+
support tag such as `stable-2026-6` or `lts-2026-6` forward to the newest
173+
supported `YYYY.M.PATCH` release in the same monthly line.
158174
- Token-bearing dist-tag mutation should reuse the existing private dist-tag
159175
workflow and operator path.
160176
- Active LTS docs and compatibility tables are updated in the same designation
161-
or correction window as the dist-tag move.
177+
or patch window as the dist-tag move.
162178

163179
### Install and update semantics
164180

165-
`stable` remains the default channel and resolves to the newest daily stable
166-
release. `lts` is explicit and resolves to the active supported LTS line.
181+
`stable` remains the default channel and resolves to the newest stable release
182+
in the fast/latest train. `lts` is explicit and resolves to the active
183+
supported LTS line.
167184

168185
The package-manager path for a new LTS install is:
169186

@@ -191,11 +208,13 @@ downgrade-prompt behavior.
191208

192209
Resolution rules:
193210

194-
- `openclaw update --channel stable` targets the newest daily stable release.
211+
- `openclaw update --channel stable` targets the newest stable release in the
212+
fast/latest train.
195213
- `openclaw update --channel lts` targets the active supported LTS line.
196214
- npm installs on the LTS channel resolve through npm dist-tag `lts`.
197-
- git installs on the LTS channel follow `release/lts` and select the newest
198-
stable or stable-correction tag reachable from that branch.
215+
- git installs on the LTS channel follow the active support branch or tag
216+
selector and select the newest `YYYY.M.PATCH` release reachable from that
217+
selector.
199218
- Exact LTS versions and tags remain supported for pinned installs and
200219
diagnostics.
201220
- Update status should distinguish configured channel from resolved artifact.
@@ -210,21 +229,23 @@ silently fall back to `latest`.
210229
OpenClaw should express LTS through channel and support metadata, not through a
211230
new version suffix.
212231

213-
- Base LTS releases keep the normal stable form `YYYY.M.D`.
214-
- LTS corrections keep the existing stable correction form `YYYY.M.D-N`.
232+
- Future base LTS releases use monthly-line form `YYYY.M.PATCH`.
233+
- Future LTS patches increment the normal patch number within that monthly line,
234+
for example `2026.6.0`, `2026.6.1`, and `2026.6.2`.
215235
- `lts` is represented by update-channel and dist-tag selection.
236+
- Future support tags may identify the monthly line explicitly, for example
237+
`stable-2026-6` or `lts-2026-6`.
216238

217-
Numeric suffixes such as `-1` already represent stable corrections in the
218-
OpenClaw release contract. Named suffixes such as `-beta.2` represent
219-
prereleases. A new `-lts.N` shape would expand OpenClaw's custom version
239+
Beta remains the fast/latest train prerelease mechanism, for example
240+
`2026.6.3-beta.1`. A new `-lts.N` shape would expand OpenClaw's custom version
220241
semantics while looking like a prerelease to generic SemVer tooling.
221242

222243
### Plugin support
223244

224245
The LTS promise must name its plugin scope.
225246

226247
- Bundled `@openclaw/*` plugins that ship with the LTS core artifact are covered
227-
by the same correction policy.
248+
by the same support-line patch policy.
228249
- First-party `@openclaw/*` plugins bundled in normal OpenClaw builds follow the
229250
LTS policy as part of the LTS artifact, even when they also exist as separate
230251
fallback packages.
@@ -249,12 +270,12 @@ emit a structured warning that the plugin is outside the LTS support promise.
249270

250271
The first LTS release should use a checked-in Markdown table as the plugin
251272
support source of truth. The table answers "which plugins are under LTS?" The
252-
existing `YYYY.M.D` and `YYYY.M.D-N` version scheme answers "which version?"
273+
monthly-line `YYYY.M.PATCH` version scheme answers "which version?"
253274

254275
Covered external plugins use the same version as the active LTS core by
255-
default. For example, active core LTS `[email protected].10-1` maps a covered
256-
WhatsApp plugin to `@openclaw/[email protected].10-1` or
257-
`clawhub:@openclaw/[email protected].10-1`.
276+
default. For example, active core LTS `[email protected].11` maps a covered
277+
WhatsApp plugin to `@openclaw/[email protected].11` or
278+
`clawhub:@openclaw/[email protected].11`.
258279

259280
The active LTS docs should publish a table in this shape:
260281

@@ -288,17 +309,17 @@ Before designating a release as LTS, OpenClaw should have:
288309
- `Full Release Validation` at `release_profile=full`.
289310
- Package acceptance against the exact published version.
290311
- Cross-OS packaged install and upgrade proof.
291-
- Upgrade proof from the base LTS release to the latest correction in that
292-
line, when a correction exists.
312+
- Upgrade proof from the base LTS release to the latest support-line patch in
313+
that line, when a patch exists.
293314
- Plugin compatibility proof for bundled plugins and any explicitly-covered
294315
official plugins.
295316
- A validated Markdown plugin LTS table for the active line.
296317
- Published docs that name the active LTS version, support window, install
297318
commands, compatibility scope, and end-of-life date.
298319

299-
For LTS correction releases, maintainers may reuse previous umbrella evidence
300-
and rerun the smallest affected release-validation box, but each correction
301-
still needs exact-version package proof before announcement.
320+
For LTS patch releases, maintainers may reuse previous umbrella evidence and
321+
rerun the smallest affected release-validation box, but each patch still needs
322+
exact-version package proof before announcement.
302323

303324
### Documentation and communication
304325

@@ -311,60 +332,69 @@ OpenClaw must publish and keep current:
311332
- The structured warning users see when a tracked plugin is outside the LTS
312333
contract.
313334
- Which fixes qualify for backport consideration.
314-
- The rule that daily `stable` remains the default recommendation.
335+
- The rule that `stable` remains the default fast/latest recommendation.
315336

316337
### Rollout plan
317338

318-
1. Adopt this policy and choose the first LTS candidate release.
339+
1. Adopt this policy and choose the first trailing monthly support line.
319340
2. Add the active LTS branch, tag, validation, compatibility, and docs
320341
obligations to the release runbook.
321-
3. Add npm `lts` dist-tag promotion and `openclaw update --channel lts`.
322-
4. Add fail-closed LTS resolution for package and git install paths.
323-
5. Add the Markdown plugin LTS table, lightweight validation, and updater
342+
3. Implement SemVer-compatible monthly-line versioning with `YYYY.M.PATCH` and
343+
beta prereleases such as `YYYY.M.PATCH-beta.N`.
344+
4. Add npm `lts` dist-tag promotion, future line tags such as `stable-2026-6`
345+
or `lts-2026-6`, and `openclaw update --channel lts`.
346+
5. Add fail-closed LTS resolution for package and git install paths.
347+
6. Add the Markdown plugin LTS table, lightweight validation, and updater
324348
warnings for official external plugins that are not listed.
325349

326350
### Worked example
327351

328352
Assume:
329353

330-
- The newest daily stable is `2026.6.18`.
354+
- The newest stable release is `2026.6.18`.
331355
- The active LTS base release is `2026.6.10`.
332-
- The newest LTS correction is `2026.6.10-1`.
356+
- The newest LTS patch is `2026.6.11`.
333357

334358
Then expected resolution is:
335359

336360
| Action | Result |
337361
| --- | --- |
338362
| `npm install -g openclaw@latest` | Installs `2026.6.18`. |
339-
| `npm install -g openclaw@lts` | Installs `2026.6.10-1`. |
363+
| `npm install -g openclaw@lts` | Installs `2026.6.11`. |
340364
| `openclaw update --channel stable` | Resolves to `2026.6.18`. |
341-
| `openclaw update --channel lts` | Resolves to `2026.6.10-1`. |
365+
| `openclaw update --channel lts` | Resolves to `2026.6.11`. |
342366

343-
Daily stable users keep following the moving stable train. LTS users follow the
344-
maintained LTS line. Version numbers remain consistent with the existing stable
345-
and stable-correction scheme.
367+
Default users keep following the moving fast/latest stable train. LTS users
368+
follow the maintained LTS line. Version numbers stay SemVer-compatible while
369+
preserving monthly-line identity.
346370

347371
## Rationale
348372

373+
### Monthly support lines
374+
375+
Monthly `YYYY.M.PATCH` lines preserve OpenClaw's calendar identity while giving
376+
support lines normal SemVer patch behavior. Patch numbers can grow as high as
377+
needed, including multiple releases on the same day.
378+
349379
### Channel designation instead of an `-lts` suffix
350380

351381
LTS is a support contract, not a new artifact identity. Channel designation
352-
preserves the existing `YYYY.M.D` and `YYYY.M.D-N` release shapes, keeps generic
353-
SemVer tooling behavior predictable, and avoids teaching OpenClaw that named
354-
suffixes can be stable support releases.
382+
keeps generic SemVer tooling behavior predictable and avoids teaching OpenClaw
383+
that named suffixes can be stable support releases.
355384

356385
### Promotion after stable instead of a parallel release train
357386

358-
Selecting an already-shipped stable release lets the daily train remain the
387+
Selecting an already-shipped monthly line lets the fast/latest train remain the
359388
quality gate and soak period. A parallel LTS factory would add build and release
360389
complexity while reducing confidence that LTS artifacts match what users already
361390
validated in stable.
362391

363-
### One active LTS line by default
392+
### One trailing monthly support line by default
364393

365-
One active LTS line keeps support, validation, docs, and plugin compatibility
366-
work bounded. Multiple active LTS lines can be added later only if maintainers
367-
have the release capacity and automation to keep each line healthy.
394+
One trailing monthly support line keeps support, validation, docs, and plugin
395+
compatibility work bounded while maintainers build the process. Quarterly or
396+
yearly lines and 4-12 month windows can be added later only if maintainers have
397+
the release capacity and automation to keep each line healthy.
368398

369399
### Same-version plugin compatibility instead of `latest`
370400

0 commit comments

Comments
 (0)