@@ -110,16 +110,26 @@ commits to the repo (manual tagging).
110110
111111## Stable Release Procedure (dev → main)
112112
113+ ** Docs are gated into the release** — ` promote ` refuses until the docs
114+ branch is flagged ready for the version being released (` --force `
115+ overrides). Doc content changes on ` dev ` in place as usual; the one-shot
116+ docs sync + review happens at release time via ` docs-ready ` .
117+
113118** ` lpb-devstack release ` is the tool** (there is no other local version path).
114119
115120``` bash
116- # 1. Readiness check (all 6 repos, non-destructive, fetches first)
121+ # 0. Flag docs as reviewed for the release (merge dev→docs, build site,
122+ # review with `cd ~/.lpb-stack/docs-preview && mike serve`, confirm →
123+ # commits DOCS_READY=<stable-version> on the docs branch + pushes)
124+ lpb-devstack release docs-ready
125+
126+ # 1. Readiness check (all 6 repos + docs verdict, non-destructive, fetches first)
117127lpb-devstack release status
118128
119129# 2. Inspect the exact plan without changing anything
120130lpb-devstack release promote --dry-run
121131
122- # 3. Promote (interactive confirmation)
132+ # 3. Promote (interactive confirmation; blocked unless docs are READY )
123133lpb-devstack release promote
124134```
125135
@@ -150,9 +160,17 @@ lpb-devstack --tag main validate
150160```
151161
152162Flags: ` --yes ` (skip confirmation), ` --dry-run ` (plan only), ` --rebase `
153- (first-release mode for unrelated histories). Re-runs are safe: promoted
163+ (first-release mode for unrelated histories), ` --force ` (promote even if
164+ docs are not flagged ready). Re-runs are safe: promoted
154165repos fast-forward or no-op.
155166
167+ Docs readiness verdicts (` release status ` , checked by ` promote ` ):
168+ - ` READY ` — ` DOCS_READY ` on the ` docs ` branch matches the release version
169+ and doc content matches ` dev `
170+ - ` MISSING ` — no flag yet → run ` lpb-devstack release docs-ready `
171+ - ` STALE ` — flag for another version, or doc content changed on ` dev `
172+ after flagging → re-run ` docs-ready `
173+
156174## Shipping a Dev Image (the common case)
157175
158176``` bash
@@ -179,18 +197,28 @@ push. `bump` (without `--push`) warns about this.
179197
180198``` bash
181199lpb-config status | update | reset [--force] | merge # config repo
200+ lpb-config render [--force] # regen runtime config from templates
182201lpb-config align # pins → latest GitHub tags
183202lpb-config memory show | setup # lpb-memory config
184203```
185204
205+ ` render ` recreates the gitignored runtime files (` settings.json ` ,
206+ ` lpb-memory-config.json ` ) from the repo's templates. lpb-config auto-renders
207+ after ` reset ` (force) / ` update ` / ` merge ` (non-forcing): without it the
208+ rendered config was unrecoverable after ` reset ` (start.sh only renders on
209+ first boot, gated by ` ~/.pi/.initialized ` ). Non-forcing render never
210+ overwrites — it creates missing files and warns on stale pins; ` --force `
211+ merges (user keys/packages preserved, template pins win in settings.json,
212+ local keys win in the memory config).
213+
186214** ` lpb-devstack ` ** — DevOps workspace tool (container + host):
187215
188216``` bash
189217lpb-devstack bump [--minor| --major] [--set V] [--no-commit] [--push]
190218lpb-devstack tag-repos [--branch dev| main] [--version V] [--dry-run]
191219lpb-devstack workspace status | sync [--extensions] | ensure [--fix]
192220lpb-devstack validate
193- lpb-devstack release status | promote [--yes] [--dry-run] [--rebase]
221+ lpb-devstack release status | docs-ready | promote [--yes] [--dry-run] [--rebase] [--force ]
194222lpb-devstack validate-hooks # full pre-commit checks (tests included)
195223
196224# Pipeline override (dev vs main) on any command:
@@ -207,11 +235,14 @@ Both tools are thin CLIs over the shared `scripts/localpibox/stack/` library
207235
2082361 . Config repo ships ` settings.json.template ` with ` __LPB_VERSION__ ` placeholders
2092372 . First boot: ` start.sh ` generates ` settings.json ` (replaces placeholders)
210- 3 . No model/provider preconfigured — user runs ` /login lemonade `
211- 4 . Pin sync: ` lpb-devstack workspace sync --extensions `
238+ 3 . ` lpb-config render ` regenerates it on demand (auto after reset/update/
239+ merge) — this is the recovery path when the rendered file is lost or
240+ its pins are stale after a stack version move
241+ 4 . No model/provider preconfigured — user runs ` /login lemonade `
242+ 5 . Pin sync: ` lpb-devstack workspace sync --extensions `
212243 (main pipeline reads the stable version from devstack ` origin/main ` )
213- 5 . ` lpb-devstack validate ` checks pins match the current stack version
214- 6 . Persistent on the host volume — survives container rebuilds
244+ 6 . ` lpb-devstack validate ` checks pins match the current stack version
245+ 7 . Persistent on the host volume — survives container rebuilds
215246
216247Pins look like: ` git:github.com/lpb-stack/pi-subagents@0.0.57-lpb-dev `
217248
@@ -269,7 +300,12 @@ Jobs:
269300 and ** fails the run if any repo's tag fails** (a partially-tagged stack
270301 is a release bug — re-running the job is idempotent, 422 = already
271302 tagged). A missing branch aborts immediately.
272- 5 . ** status** — always runs; passes when builds were skipped (no VERSION
303+ 5 . ** docs-publish** — main pipeline only, after tag-repos, only if VERSION
304+ changed: re-verifies the ` DOCS_READY ` flag on the ` docs ` branch matches
305+ the released VERSION (catches ` --force ` promotions), then
306+ ` mike deploy <version> latest ` + ` set-default latest ` → ` gh-pages `
307+ branch. Served at ` lpb-stack.github.io/devstack/<version>/ ` .
308+ 6 . ** status** — always runs; passes when builds were skipped (no VERSION
273309 change), fails otherwise only on build failure
274310
275311Images: ` ghcr.io/lpb-stack/devstack ` in two flavours per tag — ` …-cli `
0 commit comments