From 4c0c2dccab05f8966579f14d354f057955772b0b Mon Sep 17 00:00:00 2001 From: Ho1yShif Date: Tue, 21 Jul 2026 13:32:43 -0700 Subject: [PATCH 1/3] chore(deps): move test tooling out of the production image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pytest, pytest-asyncio, and httpx2 were in requirements.txt, so the hosted Render image (Dockerfile.render installs requirements.txt) shipped test-only tooling even though tests/ is excluded from the build context — pure bloat. Move them to a new requirements-dev.txt and install it where tests actually run (CI + the CONTRIBUTING manual-dev path). Production requirements.txt and both Dockerfiles now install runtime deps only; pins are unchanged and the full suite still collects (4655 tests). Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 2 +- CONTRIBUTING.md | 2 +- requirements-dev.txt | 11 +++++++++++ requirements.txt | 8 ++------ 4 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 requirements-dev.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7d3659e85..f999ca3011 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -140,7 +140,7 @@ jobs: with: python-version: "3.11" cache: pip - - run: pip install -r requirements.txt + - run: pip install -r requirements.txt -r requirements-dev.txt if: steps.docs-check.outputs.docs_only != 'true' - run: mkdir -p data # sqlite DB lives at ./data/app.db if: steps.docs-check.outputs.docs_only != 'true' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index efb38ed242..ed50c9a700 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,7 +36,7 @@ Manual development uses Python 3.11+: ```bash python3 -m venv venv source venv/bin/activate -pip install -r requirements.txt +pip install -r requirements.txt -r requirements-dev.txt # drop -dev to run the app without test tooling python -m uvicorn app:app --host 127.0.0.1 --port 7000 ``` diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000000..cdc3aa65bf --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,11 @@ +# Development / test dependencies — NOT installed in the production image. +# The hosted Render image (Dockerfile.render) installs only requirements.txt, +# and tests/ is excluded from the build context (.dockerignore), so this test +# tooling stays out of the shipped container. Install locally with: +# pip install -r requirements.txt -r requirements-dev.txt +pytest==9.1.1 +pytest-asyncio==1.4.0 +# starlette.testclient prefers httpx2 since Starlette 1.2.0 and warns on every +# TestClient import when only classic httpx is present. Runtime code keeps +# using `httpx` (in requirements.txt); this is test-client only. +httpx2==2.7.0 diff --git a/requirements.txt b/requirements.txt index 917ccce01a..4932056339 100644 --- a/requirements.txt +++ b/requirements.txt @@ -45,9 +45,5 @@ mcp==1.28.1 pyotp==2.10.0 qrcode[pil]==8.2 croniter==6.2.4 -pytest==9.1.1 -pytest-asyncio==1.4.0 -# starlette.testclient prefers httpx2 since Starlette 1.2.0 and warns on every -# TestClient import when only classic httpx is present. Runtime code keeps -# using `httpx` above; this is test-client only. -httpx2==2.7.0 +# Test/dev tooling (pytest, pytest-asyncio, httpx2) lives in requirements-dev.txt +# so it stays out of the production image — see that file. From dacf7354af71edcc27f4c23b088525cfa8b2abd1 Mon Sep 17 00:00:00 2001 From: Ho1yShif Date: Tue, 21 Jul 2026 14:00:38 -0700 Subject: [PATCH 2/3] ci: run tests on Python 3.14 to match the production runtime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI pinned Python 3.11, but the pinned deps target 3.14 (both Dockerfiles use python:3.14-slim) — numpy==2.5.1 requires >=3.12, so `pip install -r requirements.txt` failed at install time on 3.11 and the pytest job never ran. Bump both the syntax and test jobs to 3.14 so CI exercises the versions that actually ship. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f999ca3011..49470917f6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,7 +78,7 @@ jobs: persist-credentials: false - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: - python-version: "3.11" + python-version: "3.14" # Byte-compile sources — catches syntax errors without installing deps. - run: python -m compileall -q app.py core routes src services scripts tests @@ -138,7 +138,7 @@ jobs: - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 if: steps.docs-check.outputs.docs_only != 'true' with: - python-version: "3.11" + python-version: "3.14" cache: pip - run: pip install -r requirements.txt -r requirements-dev.txt if: steps.docs-check.outputs.docs_only != 'true' From 61621fd7b5d1f2e619e86a5f1ed7c5d4d1b2f660 Mon Sep 17 00:00:00 2001 From: Ho1yShif Date: Tue, 21 Jul 2026 14:07:27 -0700 Subject: [PATCH 3/3] docs(README): reference the orphaned workspace screenshot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs/odysseus-browser.jpg was committed as a README screenshot ("Refresh README screenshot") but never wired into any doc, so test_no_orphan_images_in_docs flagged it as an orphan. Add it to the README as a product screenshot below the demo clip — fulfilling its original intent instead of deleting it — which greens the docs-hygiene test. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index e5ee3fc575..44661d9016 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,10 @@ Deploy **Odysseus** on Render in one click. Get a self-hosted AI workspace — c https://github.com/user-attachments/assets/53277926-7b65-4687-8a0a-42878bd549a8 +

+ The Odysseus workspace — chat composer with the sidebar of tools: chat, email, calendar, deep research, notes, tasks, and more +

+ ## What you get This Blueprint provisions three services on Render: