# staging/chatchat — CarbonChat → ChatChat migration bundle Staged but **not deployed**. Swap awaits operator final go. See `../../docs/MIGRATION-PLAN-CHATCHAT.md` for the full plan, risk register, smoke checklist, and rollback procedure. ## Layout ``` . ├── README.md ← this file ├── build/ │ ├── build.sh ← reproducible podman build (temurin 21 + gradle 8.10) │ └── *.jar ← gitignored; (re)create via ./build.sh ├── configs/ │ ├── channels.yml ← global channel; per-recipient render = bug fix │ ├── extensions.yml ← addons (DSRV bridging off, Ess vanish on) │ ├── formats.yml ← console + default fallback formats │ └── settings.yml ← PMs, mentions, item-format └── scripts/ ├── lp-migration.sh ← Carbon → ChatChat perm grants on `default` group ├── lp-rollback.sh ← reverse of lp-migration.sh ├── rollback.sh ← full revert (stop, restore, perms, start) └── swap.sh ← full forward orchestrator with confirm gates ``` ## Quick reference ```bash # 1. Build (or rebuild) the JAR ./build/build.sh # 2. Preview the swap (read-only — opens scripts in $PAGER) ${PAGER:-less} scripts/swap.sh # 3. Execute the swap (operator-driven, confirm gates inline) ./scripts/swap.sh # 4. If smoke fails: ./scripts/rollback.sh ``` ## Why this is staged not committed-as-live Per CLAUDE.md feedback rules: - Don't touch live `/data/plugins/CarbonChat` until operator says "swap now". - LP rank prefixes/suffixes are operator-managed; this migration only touches `chatchat.*` and `carbon.*` permission nodes on the `default` group. - Build JAR is gitignored — rebuild deterministically from upstream HEAD via `build/build.sh`.