nexo/docs/runtime-image-validation.md
toki 9f5e8c2343 feat: add notification preflight milestones for all platforms and update runtime validation docs
- Add iOS notification preflight milestone
- Add macOS notification preflight milestone
- Add Linux notification preflight milestone
- Add Windows notification preflight milestone
- Update notification test milestones for all platforms
- Update phase documentation and current roadmap
- Update runtime image validation docs
- Update compose README
2026-06-01 13:08:25 +09:00

12 KiB

Nexo Runtime Image Validation

This document records the registry, tag, architecture, and verification digests for nexo-owned runtime images.

Published Images Summary

Service Target Architecture Immutable Tag Latest Tag Digest (Immutable Tag) Digest (Latest)
Core (Mattermost) linux/arm64 v11.4.2-arm64 latest sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee
Push-Proxy linux/arm64 v11.4.2-arm64 latest sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b

Verification Evidence

Registry API Manifest Headers

This section displays registry manifest verification logs, ensuring the matching Docker-Content-Digest is resolved.

# Fetch Core (Mattermost) manifests from registry
$ curl -fsSI -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' https://toki-labs.com:5050/v2/nexo/mattermost/manifests/latest
HTTP/1.1 200 OK
Server: nginx/1.29.3
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Content-Length: 6766
Docker-Content-Digest: sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee
Etag: "sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee"

# Fetch Push-Proxy manifests from registry
$ curl -fsSI -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' https://toki-labs.com:5050/v2/nexo/push-proxy/manifests/latest
HTTP/1.1 200 OK
Server: nginx/1.29.3
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Content-Length: 1577
Docker-Content-Digest: sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b
Etag: "sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b"

Remote Host Image Inspect (Architecture Proof)

This section lists concrete inspection output executed directly on the remote Mac build host (toki@toki-labs.com).

$ ssh toki@toki-labs.com '/usr/local/bin/docker image inspect toki-labs.com:5050/nexo/mattermost:latest --format "{{.Os}}/{{.Architecture}} {{range .RepoDigests}}{{.}} {{end}}" && /usr/local/bin/docker image inspect toki-labs.com:5050/nexo/mattermost:v11.4.2-arm64 --format "{{.Os}}/{{.Architecture}} {{range .RepoDigests}}{{.}} {{end}}" && /usr/local/bin/docker image inspect toki-labs.com:5050/nexo/push-proxy:latest --format "{{.Os}}/{{.Architecture}} {{range .RepoDigests}}{{.}} {{end}}" && /usr/local/bin/docker image inspect toki-labs.com:5050/nexo/push-proxy:v11.4.2-arm64 --format "{{.Os}}/{{.Architecture}} {{range .RepoDigests}}{{.}} {{end}}"'

linux/arm64 toki-labs.com:5050/nexo/mattermost@sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee
linux/arm64 toki-labs.com:5050/nexo/mattermost@sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee
linux/arm64 toki-labs.com:5050/nexo/push-proxy@sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b
linux/arm64 toki-labs.com:5050/nexo/push-proxy@sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b

Remote Compose Smoke Evidence

This section contains the validation log of copying the local compose files to the remote development host, running a config check, pulling nexo-owned images, and performing service smoke tests.

# 1. Compare local and remote file hashes (Parity Verification)
$ sha256sum docker-compose.yml .env.example
c46bc291e42b1e87ca5e6b49d118bb59c67b0b2b1412a2751c6089e49d492563  docker-compose.yml
fa56a8dc7a8dddc7737d42ec048e4f29836252e277e2d270f0ad0e7cbb38d430  .env.example

$ ssh toki@toki-labs.com 'cd ~/docker/agent-service/nexo/compose && sha256sum docker-compose.yml .env.example'
c46bc291e42b1e87ca5e6b49d118bb59c67b0b2b1412a2751c6089e49d492563  docker-compose.yml
fa56a8dc7a8dddc7737d42ec048e4f29836252e277e2d270f0ad0e7cbb38d430  .env.example

# 2. Check remote Docker Compose configuration
$ ssh toki@toki-labs.com 'cd ~/docker/agent-service/nexo/compose && /usr/local/bin/docker compose --env-file .env.example config >/tmp/nexo-compose-config.yml && /usr/bin/grep -E "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64" /tmp/nexo-compose-config.yml'
    image: toki-labs.com:5050/nexo/mattermost:latest
    platform: linux/arm64
    image: toki-labs.com:5050/nexo/push-proxy:latest

# 3. Pull and start services on the remote server
$ ssh toki@toki-labs.com 'export PATH=$PATH:/Applications/Docker.app/Contents/Resources/bin && cd ~/docker/agent-service/nexo/compose && /usr/local/bin/docker compose pull && /usr/local/bin/docker compose up -d'
Container nexo-core-db  Running
Container nexo-core-push-proxy  Recreated
Container nexo-core  Recreated
Container nexo-core-push-proxy  Started
Container nexo-core-db  Healthy
Container nexo-core  Started

# 4. Remote Runtime Smoke Checks
$ ssh toki@toki-labs.com 'cd ~/docker/agent-service/nexo/compose && curl -fsS "http://localhost:18065/api/v4/system/ping" && /usr/local/bin/docker compose exec -T db pg_isready -U mmuser -d mattermost && curl -fsSI "http://localhost:18065" && /usr/local/bin/docker compose ps push-proxy'
{"ActiveSearchBackend":"database","AndroidLatestVersion":"","AndroidMinVersion":"","IosLatestVersion":"","IosMinVersion":"","status":"OK"}
/var/run/postgresql:5432 - accepting connections
HTTP/1.1 200 OK
Cache-Control: no-cache, max-age=31556926, public
Content-Security-Policy: frame-ancestors 'self' ; script-src 'self'
Content-Type: text/html
Permissions-Policy:
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: 1z4r5bc67b89fd8x816dexgsse
X-Version-Id: 11.4.2.22416167438.bfd0f10f265c336e8b5a043b0dccdcd64438e08f73bcc5627b72c815906e1130.false
Date: Thu, 28 May 2026 01:41:27 GMT
NAME                   IMAGE                                       COMMAND            SERVICE      CREATED         STATUS         PORTS
nexo-core-push-proxy   toki-labs.com:5050/nexo/push-proxy:latest   "/usr/local/b..."   push-proxy   3 seconds ago   Up 2 seconds   0.0.0.0:18066->8066/tcp

Current Repo Runtime and App Evidence

This section presents the verification matrix for nexo local/remote runtime components and apps inside this repository.

Target Command / Manual Step Environment Expected Result Actual Evidence Status / Follow-up
Remote Runtime Smoke ssh toki@toki-labs.com '...' Remote host (toki-labs.com Mac ARM64) Active system ping returns "status":"OK", docker compose services are healthy. {"status":"OK"}, all containers (core, db, push-proxy) show Up and healthy on ports 18065/18066. PASS
Unit & Widget Tests bin/test Local workspace container All tests in packages/messaging_flutter and apps/flutter-test pass successfully. All tests passed! output from both Flutter plugin package and test app. PASS
Static Code Analysis bin/lint Local workspace container Both projects analyze cleanly with zero static issues or lint warnings. Analyzing messaging_flutter... No issues found!, Analyzing flutter-test... No issues found!. PASS
Android Build Unit Tests ssh toki@toki-labs.com 'cd ~/agent-work/nexo/apps/flutter-test/android && ./gradlew testDebugUnitTest' Remote host Android SDK (emulator-5554) Gradle compiles and runs native unit tests for the Android host wrapper. Remote Gradle test completed with BUILD SUCCESSFUL in 22s; NexoMessagingPluginTest > onMethodCall_getPlatformVersion_returnsExpectedValue() PASSED. PASS
Flutter Integration Test ssh toki@toki-labs.com 'cd ~/agent-work/nexo/apps/flutter-test && flutter test && flutter test integration_test -d emulator-5554' Remote host Flutter + Android emulator (emulator-5554) Integration test validates plugin debug event flow on connected device/emulator. Widget tests passed (4/4), debug APK built/installed on emulator-5554, and integration suite completed with all 3 tests passing. PASS
Original Mattermost App ssh toki@toki-labs.com 'cd ~/agent-work/nexo/apps/mattermost && npm run check-test' Remote host Node 22.22.3 / npm 10.9.8, Ruby/watchman Mattermost workspace ESLint + TypeScript check + Jest unit tests pass against the remote host baseline. Korean FormattedDate snapshot baseline was updated from AM to remote Intl.DateTimeFormat output 오전. Retry passed: PASS app/components/formatted_date/index.test.tsx; Test Suites: 2 skipped, 612 passed, 612 of 614 total; Tests: 7 skipped, 8162 passed, 8169 total; Snapshots: 303 passed, 303 total. PASS
Detox E2E Testing ssh toki@toki-labs.com 'cd ~/agent-work/nexo/apps/mattermost && npm run e2e:android' Remote host Android emulator + Mattermost runtime Detox builds and executes end-to-end user flows against the emulated app. Firebase debug config was supplied as ignored local/remote apps/mattermost/android/app/google-services.json with matching com.mattermost.rnbeta client, and Gradle completed assembleDebug assembleAndroidTest with BUILD SUCCESSFUL in 9m. .detoxrc.json now defaults Android emulator runs to the remote host's Pixel_6_Pro_API_34. Detox auto-boot with CI=true npm run e2e:android-test starts qemu for @Pixel_6_Pro_API_34, but the auto-booted process did not attach to adb devices after about 5 minutes. Manual Pixel_6_Pro_API_34 boot attaches as emulator-5554; with Metro and adb reverse tcp:8081 tcp:8081, a default-config smoke retry assigned server_login.e2e.ts to emulator-5554 (Pixel_6_Pro_API_34), then failed in beforeAll app readiness with Exceeded timeout of 180000 ms and Detox multiple-interaction/app-disconnect errors. FAIL — default AVD selection is fixed, but Android E2E still needs a stable boot/start procedure and app readiness/synchronization follow-up before login-flow PASS.

Consumer Project Evidence

This section records the setup, integration status, and verification metrics for sibling/consumer projects.

Target Command / Manual Step Environment Expected Result Actual Evidence Status / Follow-up
../nomadcode Setup & Dependency File scanning for dependency references Local workspace sibling Local path dependency registered and mapped to packages/messaging_flutter. apps/client/pubspec.yaml maps dependency nexo_messaging to path ../../../nexo/packages/messaging_flutter (successfully generated/resolved in .flutter-plugins-dependencies, pubspec.lock). PASS
../nomadcode Test & Smoke ../nomadcode/bin/test Local workspace sibling Core Go test suite and Client Flutter tests pass cleanly (includes push host integration). All Go module tests (cmd/plane-smoke, internal/adapters/*, etc.) and all Flutter widget tests pass successfully. PASS
../nomadcode Android Smoke Remote Android notification smoke Remote Android emulator env Real FCM credential loads, push notification arrives, and ACK is verified. Confirmed and archived in task mattermost-messaging-android-smoke on 2026-05-26/27. PASS
../iop Setup & Test cd ../iop/apps/portal && flutter test Local workspace sibling Verify integration of messaging plugin and code stability. Compiling tests failed due to upstream protobuf package version mismatch in the shared proto-socket module. No nexo_messaging dependency is integrated yet. SKIP (upstream protobuf compilation mismatch; no nexo integration yet)
../alt Setup & Test ../alt/bin/test Local workspace sibling Verify integration of messaging plugin and code stability. All tests passed! output from ALT Go server components and Flutter widget tests. No nexo_messaging dependency is integrated yet. PASS (clean baseline; no nexo integration yet)