# 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`.
