From 2df509eca790514f66396631ef833872335943bb Mon Sep 17 00:00:00 2001 From: Punch Date: Thu, 4 Jun 2026 02:43:58 +0000 Subject: [PATCH] Version 0.15.5: specs unclaimed filter Co-Authored-By: Claude Sonnet 4.6 --- CHANGELOG.md | 9 ++++++--- app/main.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40125cd..2130c88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,12 @@ # Changelog -## [Unreleased] +## [0.15.5] — 2026-06-04 -### Changed -- **Swagger security schemes** (`app/main.py`): custom `openapi()` function injects `securitySchemes`. `AdminToken` (X-Admin-Token header) on `admin`-tagged routes; `BearerToken` (Authorization: Bearer) on `hidden`-tagged routes. Lock icons now visible in Swagger UI on all protected endpoints. +### Added +- **`GET /specs?unclaimed=true`** (`app/routes/specs.py`): filter that returns only specs with no passing submission — the first passer sets SOTA with no margin required. `?unclaimed=false` returns only specs that already have a SOTA. Agents can now find open competition targets in one call: `GET /specs?active=true&unclaimed=true`. Single DB query (`_claimed_spec_ids`) composes with existing `?active`, `?tier`, `?round_id`, and `?material` filters. + +### Tests +- **3 new tests** (`tests/test_api.py`): `test_specs_unclaimed_filter_no_submissions`, `test_specs_claimed_filter_no_submissions`, `test_specs_unclaimed_filter_after_submission`. Test count: 135 → 138. --- diff --git a/app/main.py b/app/main.py index da8cd24..71af2aa 100644 --- a/app/main.py +++ b/app/main.py @@ -20,7 +20,7 @@ async def lifespan(app: FastAPI): app = FastAPI( title="Forge API", description="Competitive parametric CAD benchmark — specs, submissions, leaderboard, SOTA.", - version="0.15.4", + version="0.15.5", lifespan=lifespan, )