Install::action() hardcoded isUpgrade=false, so the CLI upgrade path
never rewrote compose/env files. Added a protected property that
Upgrade sets before calling parent::action().
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Env::__construct() now strips " and ' wrapping from values so that
_APP_DB_ADAPTER="mariadb" is read as mariadb, not "mariadb".
Without this, the upgrade flow rejected the existing database adapter
because the quoted value didn't match the whitelist.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
useExistingConfig was preventing the compose template from being
rewritten on non-local upgrades, leaving old image version tags in
place. Also fix Upgrade reading hardcoded .env instead of
getEnvFileName().
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Revert the is_int preservation — SDKs declare $sequence as string,
so the API must always return a string. Updated tests to match.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Document/Row model filters now preserve int type for $sequence instead of always casting to string
- V21 response filter recursively casts $sequence on nested relationship documents
- Added unit tests for nested document/row $sequence casting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
actions/cache uses a runner-local cache backend, so GitHub-hosted
runners and Blacksmith self-hosted runners cannot share the same cache
entry. Switch to actions/upload-artifact@v7 / download-artifact@v7
which use GitHub's artifact storage, accessible from all runner types.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Route the 6 slowest e2e test services (Databases, Sites, Functions,
Avatars, Realtime, TablesDB) to blacksmith-4vcpu-ubuntu-2404 runners
based on timing data from CI. All other services continue using
ubuntu-latest.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Steps are keyed by step name (e.g. 'env-vars'), not by status value.
The old lookup used status constants as step keys, so $status was
always null and terminal-state cleanup never triggered. Detect
terminal state by checking for $data['error'] (failure) or all steps
having 'completed' status.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>