Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
bd52b4d
feat!: fence aggregate snapshot projections by source version
patrickleet Sep 5, 2026
5ef1bb6
feat: rebuild snapshot projections from canonical history
patrickleet Sep 5, 2026
72d63c5
fix(nats): reconcile durable subscription filters
patrickleet Sep 6, 2026
8565a69
fix!: authorize retained dev process instances
patrickleet Sep 6, 2026
20e84cc
style: format runtime and client contracts
patrickleet Sep 6, 2026
f153288
test: verify projection completion before reload persistence
patrickleet Sep 6, 2026
99d5b79
ci: exercise snapshot fencing and durable NATS recovery
patrickleet Sep 6, 2026
f93d985
fix: align surface and manifest size limits
patrickleet Aug 31, 2026
fc11e43
feat: assemble applications from typed services
patrickleet Aug 31, 2026
68abd4c
fix: preserve NATS event content types
patrickleet Aug 31, 2026
b0b9c7c
feat: propagate handler causation
patrickleet Aug 31, 2026
5ccccaa
fix: strip duplicate NATS content-type metadata
patrickleet Aug 31, 2026
56f2f85
test: validate consolidated typed application assembly
patrickleet Sep 6, 2026
7f600d6
perf: add opt-in lazy generated command loading
patrickleet Sep 5, 2026
971c877
refactor: extract transport-neutral command contracts
patrickleet Sep 6, 2026
f4bb231
refactor!: remove GraphQL command compatibility APIs
patrickleet Sep 6, 2026
fff00d1
test: restore duplicate-command diagnostic source span
patrickleet Sep 6, 2026
e99e666
refactor: share SQL event and ledger operations across runtimes
patrickleet Sep 7, 2026
5c3a2e0
fix!: retain cell replay evidence in command receipts
patrickleet Sep 7, 2026
7643789
fix!: delete delivered outbox rows through shared SQL operations
patrickleet Sep 7, 2026
9c689a9
fix!: persist aggregate cells in transactional SQLite rows
patrickleet Sep 7, 2026
d9e529d
fix: preserve causal capabilities through queued repositories
patrickleet Sep 7, 2026
4a81ac9
fix: bound cell SQL batches within atomic commands
patrickleet Sep 7, 2026
bd96942
fix: infer optimistic constants from flat domain events
patrickleet Sep 7, 2026
d0967f9
feat: support boxed singular read model relationships
patrickleet Sep 8, 2026
4484e73
fix: retain source edits during initial dev startup
patrickleet Sep 8, 2026
56521b1
fix: budget structured surfaces as application contracts
patrickleet Sep 8, 2026
801e79d
fix: derive command presets from compiled preview
patrickleet Sep 8, 2026
23b14a5
feat: derive typed facts with explicit source provenance
patrickleet Sep 8, 2026
855a8ad
test: prove derived fact retry through NATS
patrickleet Sep 8, 2026
a2275d8
feat!: normalize portable application manifest inventories
patrickleet Sep 8, 2026
06723a7
fix: accept normalized manifests in CLI introspection
patrickleet Sep 8, 2026
6bf9b5b
fix: classify missing GraphQL session presets as bad requests
patrickleet Sep 8, 2026
165e2a3
feat: define direct relationships to unique candidate keys
patrickleet Sep 8, 2026
6318d97
test: verify unique-key joins and reject invalid mappings
patrickleet Sep 8, 2026
f2ae496
test: prove unique-key authorization across SQL backends
patrickleet Sep 8, 2026
2dad915
fix: resolve unique keys in internal relationship loaders
patrickleet Sep 8, 2026
896af2d
fix: align replica candidate-key joins with SQL null semantics
patrickleet Sep 8, 2026
796675c
test: verify candidate-key hydration and live updates
patrickleet Sep 8, 2026
31c7df6
style: format unique-key relationship implementation
patrickleet Sep 8, 2026
966f596
fix: report unsupported composite includes explicitly
patrickleet Sep 8, 2026
fa10e6a
test: exercise unique-key hydration in Chromium
patrickleet Sep 8, 2026
4d7cc53
fix: resolve candidate keys in projection snapshots
patrickleet Sep 8, 2026
73b3886
test: verify snapshot candidate keys on PostgreSQL
patrickleet Sep 8, 2026
25a028d
test: verify live candidate-key authorization changes
patrickleet Sep 8, 2026
cdbe29e
test: connect candidate-key projections to live queries
patrickleet Sep 8, 2026
c84c50a
test: prove candidate-key SSR and live browser delivery
patrickleet Sep 9, 2026
e41acb3
ci: diagnose dev readiness failures without exposing arguments
patrickleet Sep 9, 2026
4cad053
feat: add portable gateway routing and adapter contracts
patrickleet Sep 7, 2026
d0d7c1c
feat: share gateway identity and prove delegated auth
patrickleet Sep 7, 2026
b593d5d
feat: add native streaming application gateway
patrickleet Sep 7, 2026
8996343
feat(gateway): bind embedded and remote GraphQL execution
patrickleet Sep 7, 2026
15382d7
feat(gateway): enforce causal freshness and primary read policy
patrickleet Sep 7, 2026
d018dc0
feat(gateway): validate snapshot caches against transactional origin …
patrickleet Sep 7, 2026
6b2b4e9
feat(gateway): coalesce admitted concurrent queries with cancellation…
patrickleet Sep 7, 2026
1381850
feat(gateway): share admitted live subscriptions with bounded recovery
patrickleet Sep 7, 2026
b51f51c
feat: add Worker gateway and sharded delivery coordination
patrickleet Sep 7, 2026
3a96d39
feat: compose explicit public application gateway
patrickleet Sep 7, 2026
8d32ca1
test: update gateway migration inventory and isolate PostgreSQL fixture
patrickleet Sep 7, 2026
e55be3b
feat: measure bounded gateway delivery work and traffic
patrickleet Sep 7, 2026
88505b1
docs: record measured native and workerd delivery results
patrickleet Sep 7, 2026
29a5b1a
fix: route existing e2e runners through the public gateway
patrickleet Sep 7, 2026
ac32132
test: isolate and stabilize the physical standby fixture
patrickleet Sep 7, 2026
4dd9f2e
fix: route dev lifecycle and celld UI through the gateway
patrickleet Sep 7, 2026
83813f4
test: wait for chat delivery before asserting reload persistence
patrickleet Sep 7, 2026
4ed64c3
fix: coordinate dev socket recovery with application reloads
patrickleet Sep 7, 2026
14988d4
fix: preserve replica state across authorized session refresh
patrickleet Sep 7, 2026
ff63c1c
fix: decouple auth fixtures from application route loaders
patrickleet Sep 7, 2026
fdc0a79
fix: reconcile gateway with v5 protocol changes
patrickleet Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
54 changes: 48 additions & 6 deletions .github/workflows/integration-celld.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ name: celld (live + e2e-celld)
# make -C tests/e2e-celld test
# make -C tests/e2e-ui up && make -C tests/e2e-ui up-celld-nats
# WATCH=0 WATCH_WORKER=0 make -C tests/e2e-celld run
# E2E_UI_ORIGIN=http://localhost:5180 npx --prefix tests/e2e-ui playwright test \
# E2E_UI_ORIGIN=http://localhost:8791 npx --prefix tests/e2e-ui playwright test \
# todos.user.spec.ts chat.user.spec.ts --project chromium-user
#
# Default `cargo test` (quality) still runs fixture-only celld checks and
Expand All @@ -25,6 +25,47 @@ env:
DISTRIBUTED_INTERNAL_SECRET: test-only-internal-secret-change-me-2026

jobs:
storage:
name: celld SQL transactions and crash recovery
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@v2
with:
workspaces: tests/celld/worker -> tests/celld/worker/target
shared-key: celld-storage
- uses: actions/setup-node@v4
with:
node-version: "22"
- name: Install test runtimes
run: |
sudo apt-get update && sudo apt-get install -y sqlite3
npm install -g esbuild
cargo install worker-build --locked
curl -fsSL https://celld.dev/install.sh | sh
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
- name: Build isolated fault-probe Worker
working-directory: tests/celld/worker
run: worker-build --release --features storage-conformance
- name: Prove SQL atomicity, fencing, autonomous recovery and growth
run: node tests/celld/storage-conformance.mjs
- name: Retain storage proof results and logs
if: always()
uses: actions/upload-artifact@v4
with:
name: celld-storage-proof
path: |
/tmp/distributed-cell-storage-*/results.json
/tmp/distributed-cell-storage-*/celld-*.log
if-no-files-found: ignore

e2e-celld:
name: e2e-celld workspace tests
runs-on: ubuntu-latest
Expand Down Expand Up @@ -133,12 +174,13 @@ jobs:
export BIND=127.0.0.1:8791
export CELLD_URL=http://127.0.0.1:18880
export NATS_URL=nats://127.0.0.1:14222
export AUTH_URL=http://localhost:5180
export PUBLIC_ORIGIN=http://localhost:8791
export AUTH_URL="$PUBLIC_ORIGIN"
export AUTH_USE_SECURE_COOKIES=false
export AUTH_TRUST_HOST=true
export PUBLIC_E2E_PROFILE=celld-nats
export UI_BIND=localhost
export UI_URL=http://localhost:5180
export UI_URL=http://localhost:8791

target/debug/distributed dev tests/e2e-celld \
> tests/e2e-celld/.ci-distributed-dev.log 2>&1 &
Expand All @@ -165,13 +207,13 @@ jobs:
fi
grep -F 'lifecycle dev: process api ready http://127.0.0.1:8791' \
tests/e2e-celld/.ci-distributed-dev.log
grep -F 'lifecycle dev: process ui ready http://localhost:5180' \
grep -F 'lifecycle dev: process ui ready http://localhost:8791' \
tests/e2e-celld/.ci-distributed-dev.log

ok=0
for i in $(seq 1 60); do
code=$(curl -s -o /dev/null -w '%{http_code}' \
"http://localhost:5180/" 2>/dev/null || echo 000)
"http://localhost:8791/" 2>/dev/null || echo 000)
if [ "$code" = "200" ] || [ "$code" = "302" ] || [ "$code" = "303" ]; then
ok=1
break
Expand Down Expand Up @@ -230,7 +272,7 @@ jobs:
npx playwright test todos.user.spec.ts chat.user.spec.ts
--project chromium-user
env:
E2E_UI_ORIGIN: http://localhost:5180
E2E_UI_ORIGIN: http://localhost:8791
E2E_API_ORIGIN: http://127.0.0.1:8791
CI: true

Expand Down
20 changes: 16 additions & 4 deletions .github/workflows/integration-e2e-ui.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -106,47 +106,56 @@ jobs:
- name: Start application with Distributed dev
run: |
set -euo pipefail
export AUTH_URL="${E2E_UI_ORIGIN:-http://localhost:5180}"
export PUBLIC_ORIGIN="${E2E_UI_ORIGIN:-http://localhost:8791}"
export AUTH_URL="$PUBLIC_ORIGIN"
export AUTH_USE_SECURE_COOKIES=false
export AUTH_TRUST_HOST=true

../../target/debug/distributed dev . > .distributed-dev.log 2>&1 &
echo $! > .distributed-dev.pid

ok=0
for i in $(seq 1 240); do
# Match the CLI's bounded cold-runtime + UI readiness budget.
for i in $(seq 1 720); do
if grep -Fq 'lifecycle dev: ready generation=' .distributed-dev.log; then
ok=1
break
fi
if ! kill -0 "$(cat .distributed-dev.pid)" 2>/dev/null; then
echo "distributed dev exited before readiness"
tail -200 .distributed-dev.log
ps -eo pid,ppid,etime,stat,comm
exit 1
fi
sleep 0.5
done
if [ "$ok" != "1" ]; then
echo "distributed dev failed to become ready"
tail -200 .distributed-dev.log
# Executable names identify quiet build children without exposing
# credentials from process arguments or environment variables.
ps -eo pid,ppid,etime,stat,comm
exit 1
fi

grep -F 'lifecycle dev: process api ready http://127.0.0.1:8791' .distributed-dev.log
grep -F 'lifecycle dev: process ui ready http://localhost:5180' .distributed-dev.log
grep -F 'lifecycle dev: process ui ready http://localhost:8791' .distributed-dev.log
tail -40 .distributed-dev.log

- name: Install Playwright + Chromium
run: |
npm install
npx playwright install chromium --with-deps

- name: Verify candidate-key SSR and live delivery end to end
run: cargo test --manifest-path ../../Cargo.toml --features graphql,sqlite --test graphql_unique_key_live projected_candidate_keys_reach_chromium_over_http_and_websocket -- --ignored --exact --nocapture

- name: Run browser e2e
run: |
npm run test:browser
npm run test:lifecycle-reload
env:
E2E_UI_ORIGIN: http://localhost:5180
E2E_UI_ORIGIN: http://localhost:8791
E2E_API_ORIGIN: http://127.0.0.1:8791
CI: true

Expand All @@ -155,9 +164,12 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: e2e-ui-playwright-report
# Only the explicit paths below; never include e2e/.auth or env files.
include-hidden-files: true
path: |
tests/e2e-ui/playwright-report
tests/e2e-ui/test-results
tests/e2e-ui/.distributed-dev.log
if-no-files-found: ignore
retention-days: 7

Expand Down
222 changes: 222 additions & 0 deletions .github/workflows/integration-gateway.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
name: Application gateway

on:
pull_request:
paths:
- 'src/**'
- 'distributed_macros/**'
- 'Cargo.toml'
- 'build.rs'
- 'migrations/**'
- 'docs/gateway/**'
- 'tests/e2e-ui/**'
- 'distributed_cli/src/lifecycle/**'
- 'tests/e2e-ui/ui/src/auth.ts'
- 'tests/e2e-ui/ui/src/lib/server/**'
- 'tests/e2e-ui/ui/src/routes/api/auth/**'
- 'tests/graphql_identity/**'
- 'tests/graphql_causal_transport/**'
- 'tests/graphql_query_protocol/**'
- 'tests/edge_query_delivery*'
- 'js/src/replica/**'
- 'js/tests/replica*'
- 'tests/gateway*'
- 'tests/gateway*/**'
- '.github/workflows/integration-gateway.yaml'
workflow_dispatch:

permissions:
contents: read

jobs:
contracts:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable
targets: wasm32-unknown-unknown
components: rustfmt, clippy
- name: Format contract and fixture sources
run: rustfmt --edition 2021 --check src/gateway/mod.rs tests/gateway_routing.rs tests/gateway_extensions.rs tests/gateway-portable/src/lib.rs
- name: Test portable routing and adapter contracts
run: cargo test --manifest-path tests/gateway-portable/Cargo.toml --locked
- name: Check fixture lints
run: cargo clippy --manifest-path tests/gateway-portable/Cargo.toml --locked --all-targets -- -D warnings
- name: Compile the UI/auth consumer to Wasm
run: cargo check --manifest-path tests/gateway-portable/Cargo.toml --locked --target wasm32-unknown-unknown
- name: Test and compile portable GraphQL operation policy
run: |
cargo test --manifest-path tests/gateway-portable/Cargo.toml --locked --features gateway-delivery
cargo check --manifest-path tests/gateway-portable/Cargo.toml --locked --features gateway-delivery --target wasm32-unknown-unknown
python3 tests/gateway-portable/check_dependencies.py --features gateway-delivery
- name: Verify native and Wasm dependency isolation
run: python3 tests/gateway-portable/check_dependencies.py

auth:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version: '24'
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable
- name: Verify gateway and backend identity
run: cargo test -p distributed --no-default-features --features gateway,graphql,sqlite --test graphql_identity
- name: Install pinned auth fixture dependencies
working-directory: tests/gateway-auth
run: npm ci
- name: Install Chromium
working-directory: tests/gateway-auth
run: npx playwright install --with-deps chromium
- name: Run production Auth.js lifecycle and browser security cases
working-directory: tests/gateway-auth
run: npm test

native:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable
components: clippy
- name: Test real native HTTP streams and upgrades
run: cargo test --manifest-path tests/gateway-native/Cargo.toml --locked
- name: Check native fixture lints
run: cargo clippy --manifest-path tests/gateway-native/Cargo.toml --locked --all-targets -- -D warnings
- name: Verify UI/auth executor dependency isolation
run: python3 tests/gateway-native/check_dependencies.py

graphql:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable
- name: Verify embedded and remote GraphQL protocols
run: cargo test -p distributed --no-default-features --features gateway-graphql-native,gateway-delivery,sqlite --test gateway_graphql --test gateway_graphql_operation --test graphql_causal_transport --test graphql_query_protocol --test graphql_identity --test graphql_sqlite --test sqlite_repository

- name: Verify shared query cancellation, expiry and deadlines
run: cargo test -p distributed --no-default-features --features gateway-graphql-native,gateway-delivery,sqlite --lib gateway::native::flight::tests
- name: Verify shared live replay, expiry, backpressure and teardown
run: cargo test -p distributed --no-default-features --features gateway-graphql-native,gateway-delivery,sqlite --lib gateway::native::live::tests
- name: Verify transactional cache coverage and Atomic rollback
run: |
cargo test -p distributed --no-default-features --features gateway-graphql-native,gateway-delivery,sqlite --lib graphql::delivery::versions::tests
cargo test -p distributed --no-default-features --features gateway-graphql-native,gateway-delivery,sqlite --lib sqlite_direct_projection_and_ledger_replay_commit_atomically

freshness:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable
- uses: actions/setup-node@v4
with:
node-version: '24'
- name: Prove primary routing with paused physical standby
run: python3 tests/gateway-postgres/run.py
- name: Verify client freshness and command protocol
run: |
npm ci --prefix js
npm --prefix js run build
node --test js/tests/replica-command-runtime.test.mjs js/tests/replica-protocol.test.mjs js/tests/replica-revalidation.test.mjs js/tests/replica-graphql-transport.test.mjs
- name: Verify generated delivery metadata
run: cargo test -p distributed_cli client_compiler

worker:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version: '24'
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable
targets: wasm32-unknown-unknown
components: clippy
- name: Install pinned local Worker and auth fixtures
run: |
cargo install worker-build --version 0.8.5 --locked
npm ci --prefix tests/gateway-worker
npm ci --prefix tests/gateway-auth
cd tests/gateway-auth
npx playwright install --with-deps chromium
- name: Check Wasm build and dependency boundary
run: |
cargo check --manifest-path tests/gateway-worker/Cargo.toml --locked --target wasm32-unknown-unknown
cargo clippy --manifest-path tests/gateway-worker/Cargo.toml --locked --target wasm32-unknown-unknown -- -D warnings
python3 tests/gateway-worker/check_dependencies.py
- name: Exercise actual workerd HTTP, WebSockets and Auth.js lifecycle
run: |
node tests/gateway-worker/proxy-runtime.mjs
node tests/gateway-worker/run.mjs
- name: Measure actual native and workerd origin/client savings
run: cargo test --no-default-features --features gateway-graphql-native,gateway-delivery,sqlite --test graphql_query_protocol separate_origin_and_client_savings -- --ignored --nocapture
- uses: actions/upload-artifact@v4
if: always()
with:
name: gateway-delivery-load
path: tests/gateway-worker/artifacts/load-report.json
- name: Prove actual DO coordination, SQL reduction, restart and cancellation
run: cargo test --no-default-features --features gateway-graphql-native,gateway-delivery,sqlite --test graphql_query_protocol worker_ -- --ignored --nocapture --test-threads=1

application:
runs-on: ubuntu-latest
timeout-minutes: 35
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version: '24'
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable
targets: wasm32-unknown-unknown
- name: Install isolated browser fixture
run: |
cargo install wasm-pack --locked
npm ci --prefix tests/gateway-auth
npm ci --prefix tests/e2e-ui
cd tests/gateway-auth
npx playwright install --with-deps chromium
- name: Verify explicit application mounts
run: cargo test --no-default-features --features graphql,sqlite,application-runtime,gateway --test application_composition --test application_plans --test gateway_mounts
- name: Build coherent application and run public-origin browser flows
run: node tests/e2e-ui/gateway/run.mjs
- name: Verify dev lifecycle and browser flows through the gateway
run: GATEWAY_SKIP_BUILD=1 GATEWAY_DEV=1 node tests/e2e-ui/gateway/run.mjs
- name: Verify controlled reloads across gateway and application restarts
run: GATEWAY_SKIP_BUILD=1 GATEWAY_DEV=1 GATEWAY_LIFECYCLE=1 node tests/e2e-ui/gateway/run.mjs
- uses: actions/upload-artifact@v4
if: always()
with:
name: gateway-application
path: tests/e2e-ui/gateway/artifacts/
Loading
Loading