preview_channel_e2e installs from the stable channel, takes the preview from the published preview channel
the way the Manager does, and checks the server is current afterwards. preview_migration_e2e gains a squid
mode that keeps SQUID's SQL journals and expects SQUID's Playerbots instead of Companions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The core matches a DLL's .coapl id with its plugin lock entry. The adapter
used the repository name (mod-coa-content-scaling) while the registry and
lock use the module id (content-scaling), so the stable->preview e2e saw the
core reject Content Scaling. The build now writes the module id and refuses
a DLL that does not carry it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
derive-preview takes the higher of the requested minimum and the stable
package's. Adds the stable->preview migration e2e example (disposable server,
own ports, seeded character and module setting, production updater).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stable packages from 0.261104.94 need Manager 0.9.8; the preview was 0.9.7.
Conflicts kept the preview's module screen and plugin-aware module logic, took
master's requires-squid compatibility value and version 0.9.9 under the
preview's own product name and identifier.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
coa-release derive-preview verifies the stable update package, unpacks it,
replaces the core binaries with the plugin host build (same core commit),
adds Core/plugin-sdk.zip and Core/plugins/recommended.json, and repacks it
with the stable migrations, configuration and scripts unchanged. The result
is signed with the preview key by coa-release sign.
Tried on server-0.261104.94 and a CI plugin host: 37256 files, 3417
migrations, signature/archive/schema contract verified; the stable key
rejects the package (env-driven test).
New servers in the preview Manager are installed from the stable image; the
preview core arrives as the first update.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- keys/preview-signing.pub: preview packages and the preview pointer are
signed with a separate key, so a stable Manager (stable key only) can never
accept them. The preview Manager trusts both keys for packages (it starts
from stable servers and stable base packages); each channel pointer must
carry its own key's signature.
- Channel 'preview': pointer preview.json on the preview-channels branch,
releases preview-server-<version>. The app resolves it first and falls back
to stable until a preview release exists.
- coa-release public-key prints the public half of the signing key;
sign-channel writes the channel's own release tag.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A core that loads Content Scaling, Companions and SQUID as plugins ships
Core/plugins/recommended.json with the module repositories and commits. During
the update (the move from a monolithic stable server) the Manager downloads
each module as GitHub's archive of that commit (no git needed), builds it with
its bundled trees, installs and enables it, before the trial start. Rules keep
the bot choice: SQUID only if it was switched on in playerbots.conf, otherwise
Companions. Handled modules are remembered so a removed module is not
reinstalled; a failed one is retried at the next core change.
Verified on a CI core: Content Scaling (+packs) and Companions downloaded,
built, installed and written to the plugin lock in 225 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Modules must be compiled by the core's exact compiler. The Toolchain tab now
offers Microsoft's stable-channel Build Tools bootstrapper (VS 18) with the
14.44 toolset, core build tools, Windows SDK 26100 and CMake preselected:
downloaded from aka.ms, Authenticode-checked for Microsoft, run in its own UI
(modify mode for an existing Build Tools 18). Shows the required and selected
cl.exe versions.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The core changes almost daily and a plugin loads only into the core it was
built for. update::apply now brings every enabled plugin to the new core
before the trial start: a build already in the store is reused, otherwise it
is rebuilt from the sources recorded at its last build (build recipe). A
plugin that cannot be rebuilt is switched off with the reason (and plugins
that depend on it); the core update always goes ahead. A rollback puts the
builds for the restored core back. The update result lists rebuilt and
switched-off modules.
Also: plugin.json records the real compiler instead of a fixed string.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The loader is chosen only from directories the build compiles: Companions
has a reference pilot/ whose loader was picked and never compiled (LNK2019).
- A bundled tree inside the primary one (Content Scaling's content-packs/)
is compiled only as the bundle (was LNK2005 on every pack symbol).
- Env-driven test builds the preview modules against a CI core pair and
requires the realm's host fingerprint.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Finds every Visual Studio / Build Tools install with vswhere, reads each toolset's cl.exe
version, and calls vcvars64 (or VsDevCmd in a minimal Build Tools install) with -vcvars_ver
for the one the SDK's compiler= input names. A missing toolset is reported with the version
needed and the ones installed. CMake/Ninja come from any install, not only VS 18 Insiders.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A core update or rollback then always brings the matching SDK; an archive of
another core is ignored.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The host records its own ABI fingerprint (.coapl); the manager reads it from
worldserver.exe instead of hardcoded fingerprints (solver, provenance, analyzer).
- SDK store per realm: <realm>/.manager/sdk/<16 hex of fingerprint>/, chosen by
the host fingerprint; install_realm_sdk refuses an SDK of another core.
- Dungeon Clear is built into the SQUID DLL (bundle); persistent build cache.
- Refuse layouts whose header paths exceed Ninja's Windows path limit (such
headers counted as changed and every build became a full rebuild).
- Compile jobs limited by free RAM; full build log kept in build.log; failures
without an MSVC diagnostic report the failed step and the log tail.
Bundle test: full build 1425 s, after a one-file change 9.7 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Removed COMPANIONS_SHIMS_CPP: it redefined core functions inside the plugin as
stubs (Unit::CalculateSpellDamage/SpellDamageBonusDone/Taken -> 0,
AuraEffect::GetMiscValue -> 0, LFGMgr::GetDungeon/GetOptions/GetLockedDungeons,
Player::HasQuestForItem -> false, ...) and replaced the whole training arena
with empty functions. The DLL linked, but bots silently lost real damage, LFG
and quest logic. The core now exports those symbols (spike/plugin-host 9575b8d8e,
plus SQUID's in the next commit there).
- Stopped dropping training/ and world/encounters/ sources and the string
rewriting of BotMgr.cpp (upstream already uses the public guild API).
- Qualification reads the fingerprint from the DLL's .coapl section and compares
it with the SDK's sdk.json instead of a hard-coded constant.
- Real-build tests take turns (the engine allows one build at a time).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>