From 7d5fde10cb2538b618f4842436e2bbcf2f109733 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 2 Sep 2026 14:57:31 -0700 Subject: [PATCH 1/2] fix(examples): re-export requirements.txt so the Railway image installs ag-ui-protocol 0.1.22 PR #964 bumped pyproject.toml/uv.lock to ag-ui-protocol>=0.1.22 but left requirements.txt (what the Dockerfile actually installs from) pinned to 0.1.19. The new SubagentStartedEvent import doesn't exist in 0.1.19, so the Railway ag-ui-demo container fails at boot, /ok never comes up, and `railway up --detach` silently leaves the old deployment live. Co-Authored-By: Claude Fable 5.1 --- examples/ag-ui/python/requirements.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/ag-ui/python/requirements.txt b/examples/ag-ui/python/requirements.txt index 5d520d0ab..76a6ad4bd 100644 --- a/examples/ag-ui/python/requirements.txt +++ b/examples/ag-ui/python/requirements.txt @@ -5,8 +5,10 @@ ag-ui-a2ui-toolkit==0.0.2 # via ag-ui-langgraph ag-ui-langgraph==0.0.40 # via examples-ag-ui-python -ag-ui-protocol==0.1.19 - # via ag-ui-langgraph +ag-ui-protocol==0.1.22 + # via + # ag-ui-langgraph + # examples-ag-ui-python annotated-doc==0.0.4 # via fastapi annotated-types==0.7.0 From f3c052a06a59232680e40c343aaf88ae722d7e6b Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 2 Sep 2026 14:57:35 -0700 Subject: [PATCH 2/2] ci: fail when a Railway lane's requirements.txt drifts from uv.lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit requirements.txt is what the Dockerfile actually installs from, but uv sync/ uv.lock is what's kept in sync during normal dependency bumps — nothing previously caught the two falling out of sync (see the prior commit). Add a `uv export --no-hashes` + diff step to the examples/ag-ui e2e job and the per-cap cockpit e2e job (skipped for caps that don't check in a requirements.txt) so drift fails CI with a clear fix-it message instead of surfacing as a silent production boot failure. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/ci.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8af90bea8..8ec1bc43d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -458,6 +458,14 @@ jobs: key: uv-venv-${{ runner.os }}-py3.12-${{ hashFiles('examples/ag-ui/python/uv.lock') }} - working-directory: examples/ag-ui/python run: uv sync + - name: Check requirements.txt matches uv.lock + working-directory: examples/ag-ui/python + run: | + uv export --no-hashes -o /tmp/requirements.check.txt + if ! diff -u requirements.txt /tmp/requirements.check.txt; then + echo "::error::examples/ag-ui/python/requirements.txt is stale — the Railway image installs from this file, not uv.lock. Run 'uv export --no-hashes -o requirements.txt' in examples/ag-ui/python and commit the result." + exit 1 + fi - name: Cache Playwright browsers uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: @@ -548,6 +556,22 @@ jobs: if: matrix.cap.python != '' working-directory: ${{ matrix.cap.python }} run: uv sync + - name: Check requirements.txt matches uv.lock + if: matrix.cap.python != '' + working-directory: ${{ matrix.cap.python }} + run: | + # Only a handful of caps (the ones deployed via a Railway/Docker + # image, e.g. cockpit/ag-ui/*) check in a requirements.txt export + # alongside pyproject.toml/uv.lock. Skip caps that don't have one. + if [ ! -f requirements.txt ]; then + echo "No requirements.txt in ${{ matrix.cap.python }} — skipping drift check." + exit 0 + fi + uv export --no-hashes -o /tmp/requirements.check.txt + if ! diff -u requirements.txt /tmp/requirements.check.txt; then + echo "::error::${{ matrix.cap.python }}/requirements.txt is stale relative to uv.lock — deployments/ag-ui-dev is generated from this file. Run 'uv export --no-hashes -o requirements.txt' in ${{ matrix.cap.python }} and commit the result." + exit 1 + fi - name: Cache Playwright browsers uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: