Adds crates/coa-core/src/portable: UUIDv7 identities, namespaced content ids,
the v1 portable character model (validated, bounded, canonical), compressed
hashed snapshots, a union-only collection set, and a SQLite (WAL) store with
revisions, stale-revision rejection, rollback-as-new-revision, configurable
history, realm/item mappings and forward-only migrations.
No realm database, network or UI is touched; no existing behaviour changes.
45 new tests. Format documented in docs/PORTABLE_FORMAT.md.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Audit of the real characters schema (163 tables), save/load paths, CoA-specific
state (character_settings, wardrobe/vanity collections), id domains to remap,
running-realm hazards, Manager integration points, risks and open decisions.
Includes the exact proposed plan for Phase 1 (local canonical storage).
No production code.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Record how the OVHcloud VPS used for the future registry/relay was set up:
hardening, firewall policy, Docker layout, health check, recovery path.
No IP addresses, keys or credentials are stored.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Db runs mysql, mysqldump and mysqladmin inside the database container with
docker exec -i when the server folder is a Docker installation, connecting over
TCP on the container's loopback like the repack's commands do on the host. The
password still travels only in MYSQL_PWD. Every caller keeps using Db unchanged
(accounts, backups, population, migrations, the RA service account), and the
host needs no MySQL client. The repack path is untouched: one line before its
tools are looked up. A stopped container or a missing one is reported as a
database that is not running.
Tested: 4 new tests (commands built for the container, no password on a command
line, repack unchanged, error classification), and a real run against the
Docker folder: SQL queries, a quick backup (156 characters tables), restore with
the previous database kept, a damaged backup refused, the RA service account
created by SQL, the world server console reached through its published
loopback port, an account created through it and listed by the Manager.
A server folder with Settings/docker.json is a Docker installation: MySQL, the
auth server and the world server run in containers controlled through the
docker command line. Every other folder is a repack and goes through the
unchanged Windows code. driver::run, process::observe and layout::scan check
for the marker first and hand over to coa_core::docker.
- start: network, runtime image (libraries only, binaries are mounted from
Core/), database healthy, world listening, then auth. A container that stops
while starting reports the cause found in its log (DatabaseNotRunning,
PortInUse, ...). New error code DockerUnavailable (docker missing, stopped,
or not usable by this user).
- stop: world (180 s to save), auth, database; exit code 0 observed.
- observe: container state, health and port readiness mapped to the existing
ServiceState. Readiness is a connection that stays open, because Docker's
proxy accepts connections before the server inside listens.
- passwords go by environment, never on a command line; the remote console is
published on 127.0.0.1 only; the server's own database updater is turned off
(it needs a mysql client the image does not have and stops the server).
Tested: 18 new tests with an in-memory Docker, and a real run through
examples/drive: database, world (ready in 11 s) and auth started from a
package-shaped folder, stopped with exit code 0 and restarted.
Not included: installation, database setup, backups and SQL through the
container, updates, firewall/exposure, the client under Wine/Proton.
A server without a module's active file (an old repack updated by the Manager) made two modules log a
'missing property' line on every world tick.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A choice about files the owner changed appears in place below the buttons. First-time client setup keeps its dialog.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- main: set WEBKIT_DISABLE_DMABUF_RENDERER=1 on Linux unless the user did.
WebKitGTK's DMA-BUF renderer ended the process at startup with a Wayland
"Protocol error" (seen with an NVIDIA card on Wayland).
- data_dir: use $XDG_DATA_HOME (absolute only) or ~/.local/share on Linux
instead of the temp folder. Windows keeps %LOCALAPPDATA%.
- open_link: xdg-open on Linux, explorer.exe on Windows as before.
- tailscale_exe: look in the usual Linux locations.
Every Windows branch is the previous code unchanged.
- config snapshots: two snapshots of the same scope in the same millisecond
shared one folder. A restore snapshots the current state just before reading
the snapshot it restores, so on a fast disk the snapshot being restored was
overwritten with the current files and the restore did nothing. Each snapshot
now gets its own folder (numeric suffix when the name is taken). This was the
intermittent failure of snapshot_restore_roundtrip_is_byte_exact_and_undoable.
- package extract: restore the execute bit on ELF binaries and #! scripts (the
archive carries no modes). No effect on Windows.
- fsx::starts_with_ci: case-insensitive on Windows only; /srv/CoA and /srv/coa
are different folders on Linux.
- registry test: use a root path that is a root on the running OS.
cargo test --workspace on Linux: 157 passed, 0 failed.
The collection switches and every other documented setting become tabs of the same
panel, are searched together with the curated settings and are saved by the same bar.
The Modules page drops the status legend; Playerbots is named SQUID's Playerbots.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>