All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2.0.0 (2026-07-01)
- idempotency: CreateMediaBuyRequest.idempotency_key is now REQUIRED, inheriting the adcp library field (str, MinLen 16, MaxLen 255, pattern limited to [A-Za-z0-9_.:-]) -- the create-side optional override is deleted and its schema-inheritance allowlist entry removed. A missing key rejects as VALIDATION_ERROR at the schema boundary (the storyboard missing_key step); the MCP/A2A wrappers omit the kwarg when absent so the wire message is the spec's "Field required", not a None type error. update_media_buy and sync_* keys stay optional -- a deliberate create-first rollout, since the update BDD contract still encodes optional keys.
- add CPA and time-based pricing model support (AdCP 3.1) (#1473) (970c0e1)
- bdd: render UC-011/019/026 feature files to AdCP 3.1 (merge mode) (4e9c183)
- behavioral test foundation for safe refactoring — BDD harness, 10 use cases, 4-transport coverage (#1335) (61f6ad9)
- ci: parallel BDD CI shards with merged coverage (stacked on PR3) (#1379) (19d3efd)
- idempotency: success-cache replay (PR 1 after error-emission) (#1312) (b94ab97)
- implement by_device_type breakdown and truncation flags (#1376) (#1475) (ab6840c)
- match list_creative_formats format_ids on (agent_url, id) federation pair (#1411) (#1479) (c1802c3)
- migrate to adcp 3.12.0 (rc.3 spec alignment) (#1217) (0cf4de7)
- round-trip property_list and add collection_list on media-buy (#1275) (#1276) (cfb7597)
- upgrade adcp SDK 3.12→4.3 and import protocol metadata (#1266) (5011855)
- add explicit strict=False to pairwise zip() in uc002 (B905) (f89201c)
- agent-db: resolve PROJECT_DIR to the worktree root, not the skill dir (#1443) (ad33521)
- apply selection_type inference to inventory profile publisher_properties (#1174) (a50ff50)
- bdd: add brand+op+sandbox account-resolution boundary branch (67681ed)
- bdd: add natural_key_sandbox account-resolution Given branch (26540ea)
- bdd: add reach_unit Given parser to stop status-column overflow (9249071)
- bdd: parse space-separated status_filter so v3.1 values reach _impl (0a9612c)
- bdd: resolve 'media_buy_ids provided' boundary to an IDs request (ed9633f)
- bdd: revert too-broad request_params parser; xfail pending_* status filters (2073994)
- bust browser cache on favicon re-upload (#1255) (a50e9b9), closes #1254
- ci: #1233 prep — D9/D11 docs, remove requires_server tests, scorecard harden-runner (#1478) (fa1b4da)
- ci: bump authlib 1.6.11 -> 1.7.2 for PYSEC-2026-188 (7399a77)
- ci: bump uv 0.11.6 -> 0.11.15 for GHSA-4gg8-gxpx-9rph (#1375) (e4e8b4d)
- ci: cache creative agent build with buildx GHA cache (#1189) (#1437) (c1f0ab1)
- ci: format compile_bdd.py and bump aiohttp 3.13.5 -> 3.14.0 (081d3e4)
- ci: operational helper layering and guard completeness (PR 3-3 of #1234) (#1424) (fa4221b)
- ci: pass GITHUB_TOKEN to pinact to avoid anonymous rate limit (#1344) (5ec6b16)
- ci: tighten check_no_skip_tests and hook-count guard (Pattern 4, #1234) (#1460) (7ecb77b)
- correct GAM service account authorization instructions (#1218) (c2ce35e)
- deps: bump aiohttp + authlib for CVE-2026-34993 / PYSEC-2026-188 (#1385) (a54b906)
- deps: bump mako, python-multipart, urllib3 for security audit (#1298) (a8e6bad)
- docker: patch base-image and supercronic CVEs blocking the release Trivy gate (#1510) (6bd96b1)
- error-handling cleanup — data loss bugs, silent catches, structural guard (#1078) (#1212) (e5886aa)
- forward typed account in get_media_buy_delivery A2A skill (#1438) (2a1f557)
- GAM test-connection must not report success with no accessible network (#1219) (6bf9d6a)
- gh-#1264 memory-leak follow-ups and test-suite integrity (#1334) (b47f1b0)
- implement empty BDD Given step bodies (#1181) (#1185) (d0b472c)
- lazy-loading inventory tree to prevent OOM on large GAM networks (#1176) (5c0e2c0)
- link ObjectWorkflowMapping on auto-approve path before push notification (#1378) (#1461) (cced480)
- mcp: accept creative format relationship filters (#1331) (d8ff48d)
- memory: leak triage #3 + #5 + #6 + sibling reapers (4 fixes) (#1264) (b57e27d)
- move app venv to /opt/venv to stop stale compose overlays (#1310) (#1488) (6cd14e6)
- normalize domains in property filtering to handle www/m subdomains (#1207) (76701c1)
- push held-back creatives to GAM after creative approval (#1038) (#1337) (04c3af5)
- remove invoice_recipient from UpdateMediaBuyRequest (717f5a7)
- replace broken adcontextprotocol.org auth setup guide link (#1252) (#1253) (beeff5c)
- restore AdCPValidationError import lost in merge auto-resolution (af39e87)
- schema: align GetProductsRequest push notification config (#1393) (7cb7e00)
- serialize push_notification_config with mode='json' at MCP/A2A transport boundaries (#1464) (31dd6b4), closes #1377
- strengthen 131 weak BDD Then step assertions with production-value checks (78be790)
- test-harness: implement MediaBuyCreateEnv's missing setup helpers (#1382) (ac1e97a)
- test: read step files as UTF-8 in bdd-no-direct-call-impl guard (#1431) (246d85c)
- tests: remove stale strict xfails on get-products schema drift (#1336) (8aebd75)
- use shared _get_error_message() instead of str(error).lower() in uc004 (wdge) (1629369)
- wrap account dict in AccountReference and normalise list-form assignments in sync_creatives (#1251) (14dbefd)
- add _require/_require_error helpers + guard ctx['error'] subscripts in BDD Then steps (qlsx-a) (bbbcda5)
- consolidate account reference coercion (#1439) (aa02c54)
- extract _assert_exponential_backoff helper in uc004_delivery (vpgh) (d2f1474)
- extract _assert_format_check_outcome helper in uc006_sync_creatives (ftmy) (c5ef5c1)
- extract _get_assignment_from_db helper in uc006_sync_creatives (spug) (9c2fc60)
- extract shared helpers in property discovery service (#1206) (426fd97)
- move billing policy and approval mode to tenant configuration (#1184) (#1186) (5ef141a)
- move then_webhook_notification to uc002 domain step file (aya0) (c7a1527)
- relocate pre-commit hooks to appropriate layers (PR 4 of #1234) (#1390) (afbe8e8)
- replace 6 SUSPECT auth_setup_mode tests with endpoint-level coverage (c05aa70)
- replace SUSPECT auth_setup_mode tests with endpoint-level coverage (f4aa3ad)
- test: adopt iter_call_expressions in architecture guards (Pattern 1b, #1234) (#1457) (25472b7)
- adcp: correct AdCP spec version citations to introduction tags (#1356) (84db058)
- add 2.0.0 release notes and establish docs/releases convention (#1444) (4039fdc)
- document Code Quality path scope mirroring CodeQL (#1422) (#1491) (260e8d6)
1.7.0 (2026-04-09)
- Account management, adcp 3.10 migration, and BDD test infrastructure (#1170) (ccf91eb)
- introduce BDD behavioral test suite (delivery metrics, creative formats) (#1146) (7f0d45a)
- universal request normalization for AdCP backward compatibility (#1175) (1ad11b6)
- add missing AdCP spec fields to UpdateMediaBuyRequest and correct e2e assertions (#1152) (e9a7a67)
- apply SSRF protection to signals agent URL ingestion (F-04) (c18ac11)
- ci e2e port allocation and setting | crypto package update (#1188) (e48edda)
- enforce update budget guardrails and preserve currency in media … (#1140) (1e1aa6d)
- harden login redirect validation and test-auth gate (F-06, F-02) (#1141) (cd56496)
- raise on anomalous empty format responses instead of silent return [] (#1167) (149f58b)
- replace dict subscript with attribute access on FormatId objects (#1166) (80c5776)
- require authenticated principal for task management tools (#1139) (ff1006d)
- resolve CI failures on PR #1143 (5c5f34f)
- use request.script_root for dynamic URL prefixing (#1160) (0b304ed)
- video/display format template appears unselected after saving product (#1168) (9e395c5)
1.6.0 (2026-03-19)
- coerce AnyUrl to str before passing to yarl.URL() (#1106) (#1118) (641ee9e)
- creative agent TextContent fallback for adcp SDK 3.6.0 (#1135) (d83ed14)
- normalize admin UI to canonical /admin routes (0283124)
- persist platform_line_item_ids in execute_approved_media_buy (#1126) (6a9776d)
- remove unauthenticated /init-api-key endpoint and harden control-plane auth (#1103) (3a336ef)
- resolve forked Alembic migration graph and prevent recurrence (#1144) (a4cd866)
- restore pre-#1066 admin routes via flask fallback mount (4b919f3)
- Skip format validation when creative agent returns no formats (#1137) (1173473)
- complete delivery schema extraction from _base.py (#1121) (46624e9)
- Eliminate get_db_session() from business logic — complete repository pattern adoption (#1097) (1965f1d)
- extract shared delivery helpers and migrate all adapters (#1124) (e8a9b8a)
1.5.0 (2026-03-09)
- AdCP v3.6 upgrade — schema migration, auth hardening, repository pattern, multi-tenant isolation (#1071) (3398aab)
- Creative domain completion — v3.6 schema, auth hardening, error propagation, 3300+ tests (#1080) (0cbe97c)
- delivery domain completion + media buy test coverage (v3.6) (#1081) (46db70f)
- Error recovery classification and standard error vocabulary (#1083) (96ed70f)
- Product v3.6 completion — schema extraction, repository pattern, obligation test coverage (#1082) (90e1dfa)
1.4.0 (2026-02-27)
- Add Broadstreet Ads adapter with template support (#1013) (d7db92e)
- implement get_media_buys tool with delivery snapshots (#1063) (0ebcf93)
- Support AdCP v3 structured geo targeting (#1006) (#1024) (ec3939a)
- Add root-level URL fallback for simple creatives (843ab76)
- bump googleads to 49.0.0 and remove GAM_API_VERSION constant (#1070) (f6ce2a9)
- handle FormatId objects in format validation during media buy creation (3e9dcaf)
- improve test harness stability and add real GAM e2e tests (#1062) (52dc231)
- propagate delivery_type in GAM products_map for correct line item type selection (#1058) (ff36add)
- resolve property_ids/property_tags authorization in property discovery (#1054) (a188b6a)
- Unify creative URL extraction and update GAM macro mappings (56cbc6a)
- Unify creative URL extraction and update GAM macro mappings (70b04e2)
- Update vulnerable dependencies (cryptography, pillow) (4ba6c61)
- use attribute access for FormatId in format validation during media buy creation (502f978), closes #1019
- eliminate model_dump antipatterns and migrate to adcp library base classes (#1051) (5e6815f)
- enforce typed model boundaries across serialization and data flow (#1044) (c412ce9)
1.3.1 (2026-02-06)
1.3.0 (2026-02-04)
- Add schema-driven adapter configuration (#1007) (e6324b6)
- Display version in tenant landing page footer (27780c5)
- Display version in tenant landing page footer (37015e6)
- Add audit logging for get_products, update_media_buy, and update_performance_index (9dfd39b)
- Add audit logging for get_products, update_media_buy, and update_performance_index (d563dc8)
- Correct comment to match actual implementation (starts with, not contains) (666f889)
- Improve GAM creative-to-line-item matching for flexible naming templates (126f0dd)
- Improve GAM creative-to-line-item matching for flexible naming templates (7d85208)
- more tests (88b0347)
- mypy (0aeb111)
- preserve format dimensions during media buy approval (1bdc4a7)
- preserve format dimensions during media buy approval (dc2429e)
- Preserve signup flow state through OAuth redirect (7e63052)
- Preserve signup flow state through OAuth redirect (735211d)
- reset tests to main (03e32db)
- tests (491e21e)
- Update organization and repository names in ipr sig workflow (3217152)
- Use dynamic dates in GAM pricing restriction tests (bef48d1)
- Use dynamic dates in pricing integration tests (a89dc8a)
- Add PR naming guideline to CLAUDE.md (34a87be)
1.2.0 (2026-01-29)
- ipr policy should point to prebid.org (1fad905)
- Remove unnecessary trafficker_id requirement from GAM creatives_manager (#975) (87fad8a)
- fix repo loc (03ffce8)
1.1.0 (2026-01-26)
1.0.0 (2026-01-26)
- This updates the AdCP library dependency from 2.14.0 to 3.0.0.
0.9.3 (2026-01-25)
- Handle product.format_ids as dicts in creative validation (#965) (1c760e6)
- ignore url not configured when use mock adapters (#943) (7f55e02)
0.9.2 (2026-01-22)
0.9.1 (2026-01-19)
- Sync custom targeting keys to adapter_config during inventory sync (fa187f9)
- Sync custom targeting keys to adapter_config during inventory sync (d49badc)
0.9.0 (2026-01-16)
- Add role name fallback for tracker detection and fix REDIRECT_URL macro (4054133)
- Add tracker_redirect support with REDIRECTION_URL macro (6b34831)
- Add tracking pixel macro substitution for GAM adapter (a3dd2d1)
- Add isinstance check for list before append in creative_helpers (8b42656)
- Improve click tracker and native creative tracking handling (ade8de4)
- Pass tenant_gemini_key as keyword argument to build_order_name_context (5f4f1f1)
- Restore click tracking URL support via destinationUrl (c3eeab7)
0.8.0 (2026-01-14)
- update to adcp 2.18.0 with new assets field support (6d19499)
- update to adcp 2.18.0 with new assets field support (4c94434)
- Accept Authorization: Bearer header for MCP authentication (#948) (a1ae3ff)
- Fix CI test failures and security vulnerabilities (f1e4c40)
- Improve onboarding experience and resolve first-run issues (#946) (e803e85)
- resolve mypy type errors for adcp 2.18.0 format assets (7d0a021)
- Update adcp to 2.18.0 for assets field support (9693fcc)
- Update adcp to 2.18.0 for assets field support (ebfb27d)
- update tests for adcp 2.18.0 compatibility (0a60085)
- update urllib3 and werkzeug to fix security vulnerabilities (9490db8)
- use dynamic adcp version in e2e tests instead of hardcoded 2.5.0 (ecee6f2)
- rename asset_req to asset_spec for clarity (f15c9ea)
- clarify that repeatable groups were never supported in asset extraction (dbee49e)
0.7.0 (2026-01-08)
- a2a bugs with media buy and media buy delivery (c5325b9)
- a2a bugs with media buy and media buy delivery (ea98357)
- Add security audit to CI and upgrade fastmcp (#941) (ec592ed)
- Include empty pricing_options in serialization for anonymous users (#939) (4e57265)
- Set default role to admin for SSO auto-provisioned users (#937) (e64440c)
0.6.0 (2026-01-05)
- Add GAM placement targeting for creative-level targeting (adcp#208) (#915) (b2f9585)
- apply suggestions (362513f)
- apply suggestions (9b75990)
- improve e2e test for a2a push notification delivery v2 (f9008b9)
- Make SSO optional for multi-tenant deployments (#931) (8ac80a1)
- migrate push notification sending for media_buy (6fa4cda)
- undo unrelated changes (9a7e45f)
- update webhook delivery function to support both mcp and a2a payloads (7f41d98)
- update webhook delivery function to support both mcp and a2a payloads (27b2eaa)
- wip (0713543)
- adcp version; media buy status change; media buy delivery look up (41dd1dc)
- Add Fly.io header middleware for proper HTTPS detection (#920) (a115fc9)
- Add multi-admin domain support for cross-domain OAuth (#919) (f373ebb)
- Clear session before OAuth to prevent stale cookie conflicts (#924) (addab84)
- Correct middleware ordering for Fly.io header processing (#921) (c4d373d)
- e2e webhook delivery check (1599266)
- Explicitly save session on OAuth redirect to persist state cookie (#928) (e78ae67)
- Fix list_creatives enum serialization and invalid creative count (#930) (3d9c643)
- improve tests (676690b)
- integration test v2 (756d6d4)
- integrations (8050605)
- link validator check for cyclic bugs (91fe6f7)
- mypy failures (79de36d)
- Preserve tenant context on OAuth callback errors (#918) (c82760b)
- Preserve X-Forwarded-Proto from Fly.io through nginx (#922) (5eddd36)
- Prevent redirect loop for super admins accessing /admin/ (#929) (95d7cac)
- Restore deleted migration to fix Fly.io deploy (#914) (2cfbccc)
- Reuse unwrapped brand_manifest for policy checks (#932) (#935) (03ba408)
- Route multi-tenant subdomain requests to tenant-specific login (#916) (c0152db)
- Run database migrations automatically on docker compose up (#933) (c5c73a8)
- run_all_tests ci (3a1b1d2)
- Show full values in Pydantic extra_forbidden errors (#912) (165d985)
- Task and TaskStatusUpdate serializations (a8e7792)
- Use global OAuth as fallback, not setup mode for multi-tenant (#917) (ef63349)
0.5.0 (2026-01-01)
- Add dynamic per-tenant OIDC/SSO authentication (#903) (ed05a41)
- Add format template picker UI for AdCP 2.5 parameterized formats (#782) (#882) (532657e)
- Add vidium MCP server to local configuration (#904) (ebcfdd1)
- Convert advertising channel from single to multi-select (#897) (a1aa8e4)
- Display sales agent version in agent card (#902) (663702b)
- Implement AI product ranking with simplified catalog (#906) (d59e76b)
- Simplify user authorization with User records as primary auth method (#907) (504b489)
- Simplify Docker Compose setup to fix mount errors (#910) (723b0b2)
- Single-tenant deployment and SSO configuration (#908) (e725781)
- src.core.format_spec_cache undefined (#901) (e3e701c)
- Update docs links and fix alembic migrations (#911) (e498a43)
- Use pull_request_target for PR title check on fork PRs (#909) (bb9817d)
0.4.1 (2025-12-29)
- Add Fly Managed Postgres option to deployment guide (#894) (6bf6ce9)
- Fix GCP Cloud Run deployment walkthrough (#896) (10a9674)
0.4.0 (2025-12-28)
- Add GAM currency detection and Budget Controls integration (#887) (f7539e3)
- Consolidate Docker entrypoint to use Python directly (#880) (a12b19d)
- Default to production setup, make demo mode opt-in (#883) (580bcfe)
- Restrict currency selection to GAM-supported currencies (#890) (1076539)
0.3.0 (2025-12-26)
- Add Docker Hub as secondary container registry (#878) (71e7d2f)
- Enhance AdCP 2.5 creative rotation weight support with improved error handling (#876) (d226b58)
0.2.1 (2025-12-25)
0.2.0 (2025-12-24)
- Improve Docker quickstart - ARM64 support, better docs, fail-fast validation (#859) (ba3f81a)
- Improve single-tenant mode UX and Docker quickstart (#868) (8559f8d)
- Pydantic AI multi-provider integration with admin UI (#860) (1ff0366)
- show access token directly in advertisers table (#867) (ceac7b0)
- enforce tenant human_review_required for media buy approval (#866) (92c562e)
- Fix/format ids type handling for the format_ids in the products table (#864) (bd65beb)
- Update release-please to use manifest mode (v4 config) (925a1b2)
- Add Conventional Commits guidance to CLAUDE.md (4578eab)
- Add platform-specific deployment guides and Cloud SQL improvements (#869) (38626f8)
- Update quickstart to use published Docker images (#857) (435d6d2)
- Update quickstart to use published Docker images (#857) (#861) (7db5c94)
- Media buy creation now FAILS when creatives are missing required fields (URL, dimensions) instead of silently skipping them.
- Add AdCP 2.5 extension to A2A agent card (#783) (a979cb6)
- add auth_header and timeout columns to creative_agents table (#714) (64eecd8)
- add background scheduler to auto-transition media buy statuses based on flight dates (4af1343)
- add background scheduler to auto-transition media buy statuses based on flight dates (d6f8d78)
- Add brand manifest policy system for flexible product discovery (#663) (1c00e1d)
- Add brand manifest policy UI dropdown in Admin (#726) (55d2414)
- add commitizen for automated version management (#666) (4c49051)
- Add creative format size filtering with inventory-based suggestions (#690) (ced6466)
- add date range validation and testing for validation (9706fd1)
- Add hierarchical product picker with search and caching (#707) (6a6c23d)
- Add inventory profiles for reusable inventory configuration (#722) (ceb2363)
- Add manual delivery webhook trigger to admin UI (f91d55e)
- Add manual delivery webhook trigger to admin UI (e95d6f4)
- Add real-time custom targeting values endpoint and visual selector widget (#678) (ebd89b9)
- Add signals agent registry with unified MCP client (#621) (9a15431)
- alphabetize targeting keys/values and show display names (#687) (c6be06d)
- Auto-download AdCP schemas on workspace startup (#616) (94c3876)
- calculate clicks and ctr (ebe7d66)
- enforce strict AdCP v1 spec compliance for Creative model (BREAKING CHANGE) (#706) (ff1cbc4)
- improve product workflow - always show formats and descriptive targeting values (#688) (4530f25)
- Publish Docker images on release (#855) (47e88e3)
- refactor and add integration and e2e tests for delivery metrics webhooks (3df36de)
- refactor webhook deliveries (f1302ba)
- Remove Scope3 dependencies - make codebase vendor-neutral (#668) (de503bf)
- Simplify targeting selector to match existing UI patterns (#679) (ce76f8e)
- support application level context (#735) (ea6891d)
- Update budget handling to match AdCP v2.2.0 specification (#635) (0a9dd4a)
- 'Select All' buttons in Create Product page by fixing JS scope (5f5553a)
- 'Select All' buttons in Create Product page by fixing JS scope (6bcca14)
- Achieve 100% mypy compliance in src/ directory - 881 errors to 0 (#662) (d7f4711)
- ad unit format button, targeting selector crash, and service account auth (#723) (83bd497)
- AdCP responses now exclude None values in JSON serialization (#642) (c3fa69a)
- AdCP responses now properly omit null/empty optional fields (#638) (ab7c4cd)
- Add /admin prefix to OAuth redirect URI for nginx routing (#651) (a95a534)
- Add content hash verification to prevent meta file noise (#659) (20b0a16)
- add e2e tests for get_media_buy_delivery direct request (1263a81)
- Add logging + fix targeting browser sync button (#677) (bdf19cc)
- Add missing /api/tenant/<tenant_id>/products endpoint (9dc4bdc)
- Add missing activity feed and audit logs to manual approval path (#729) (114778c)
- Add missing adapter_type to SyncJob creation (fb0fb79)
- Add null safety checks for audience.type and audience.segment_type (#682) (b8e6e77)
- add pricing to delivery (78eab1e)
- Add timeout to discover_ad_units to prevent stuck syncs (56457ad)
- add type field to audience segments API for filtering (28302f2)
- add type field to audience segments API for filtering (474df9a)
- advertiser creation (4e9e32d)
- advertiser creation (d323477)
- apply type filter when fetching inventory by IDs (3fc3ded)
- approval flow (ee2e90a)
- attempt to fix e2e test in ci (8c269a8)
- Auto-create default principal and improve setup output (#849) (0c222f3)
- Auto-create user records for authorized emails on tenant login (#492) (454eb8f)
- Check super admin status before signup flow redirect (#674) (e5dfb8d)
- Clean up smoke tests and resolve warnings (#629) (73cbc99)
- Complete /admin prefix handling for all API calls (#736) (4c20c9c)
- Convert FormatReference to FormatId in MediaPackage reconstruction (#656) (7c24705)
- Convert summary dict to JSON string in sync completion (3318ee0)
- convert to utc (bcb54f0)
- Correct AdManagerClient signature for service account auth (#571) (bcb1686), closes #570
- Correct API field name mismatch in targeting selector widget (#681) (9573749)
- correct creative agent URL typo (creatives → creative) (#844) (f29659b)
- correct inventory search endpoint and parameters in unified view (201fd4f)
- correct inventory search endpoint and parameters in unified view (5532adb)
- Correct tenant context ordering in update_media_buy (#773) (2c2d9b1)
- Create mock properties only for mock adapters (#854) (efdcfca)
- creative agent url check; allow to fallback to /mcp when creating mcp client (09bc1ac)
- creative agent url check; allow to fallback to /mcp when creating mcp client (6bf221f)
- creative approval/rejection webhook delivery (9062449)
- Creative management - reject invalid creatives (#460) (1540de3)
- Default publisher_properties to 'all' when not specified (#759) (690f2b1)
- display and save custom targeting keys in product inventory (#692) (991656b)
- Docker test cleanup to prevent 100GB+ resource accumulation (9036cae)
- Docker test cleanup to prevent 100GB+ resource accumulation (9ed12fd)
- e2e test context initialization (0c463a1)
- e2e test for media buy deliveries webhooks (64d9529)
- edit configuration feature (fb61f20)
- Enable all 189 integration_v2 tests - achieve 100% coverage goal (#626) (6377462)
- enforce brand_manifest_policy in get_products (#731) (075e681)
- Ensure Package objects always have valid status (#755) (757c0d3)
- ensure User record creation during OAuth tenant selection (#701) (be22ffb)
- Exclude null values from list_authorized_properties response (#647) (5afb6b5)
- existing unit tests (60a1961)
- fetch inventory by IDs to bypass 500-item API limit (c1e197e)
- fetch specific ad units by ID for placement size extraction (85f792d)
- file lint error (#625) (2fec26e)
- flush deleted inventory mappings before recreating (c83e34c)
- GAM adapter (f4f0df1)
- GAM adpaters and other logic changes including bumping adcp client to 2.5.5 (8367e0a)
- GAM advertiser search and pagination with Select2 UI (#710) (792d4ae)
- GAM product placements not saving when line_item_type absent (#691) (eb66e33)
- GAM test connection error fix (78e88ae)
- GAM test error fix (48b07a9)
- Handle /admin prefix in login redirects and API calls (#733) (15ab582)
- Handle CreateMediaBuyError response in approval and main flows (#745) (574943b)
- Handle unrestricted agents in property discovery (no property_ids = all properties) (#750) (136575b)
- Implement creative assignment in update_media_buy (#560) (99cdcdc)
- implement missing naming template preview logic (39eafff)
- implement missing naming template preview logic (66fc55d)
- Implement missing update_media_buy field persistence (#749) (f67a304)
- Import get_testing_context in list_authorized_properties (#632) (6612c7d)
- improve creative status handling and dashboard visibility (#711) (539e1bb)
- improve inventory browser UX and fix search lag (#709) (0d09f1b)
- include ALL statuses when fetching inventory names for existing products (2a61600)
- Include service_account_email in adapter_config dict for template (#517) (c36aef6)
- increase sync_id length from 50 to 100 (cd89098)
- increase sync_id length from 50 to 100 (6ae87ff)
- Integration tests, mypy errors, and AdCP schema compliance (#633) (77c4da6)
- Integration tests, mypy errors, and deprecation warnings (#628) (be52151)
- Integration tests, mypy errors, and test infrastructure improvements (#631) (ca4c184)
- inventory profile save URL and property_mode handling (40f192a)
- inventory profile save URL and property_mode handling (7440350)
- inventory sync (d300258)
- Inventory sync JavaScript errors (0d2ad1f)
- inventory sync status now checks GAMInventory table instead of Products (#708) (193e87d)
- lint errors (dff427a)
- list_tasks query using non-existent WorkflowStep.tenant_id (#822) (c17abcb)
- Load pricing_options when querying products (#413) (a87c69a)
- make media_buy_ids optional in get_media_buy_delivery per AdCP spec (#704) (5c69013)
- media buy tests creation (4045386)
- media buys & creatives (58c4f45)
- mypy (77b5ecc)
- nest inventory picker modal to resolve search input focus issue (a14c47b)
- nest inventory picker modal to resolve search input focus issue (f888fe9)
- Normalize agent URL variations for consistent validation (#497) (9bef942)
- parse and apply custom targeting from product forms to GAM line items (#686) (a1132ae)
- pass DELIVERY_WEBhOOK_INTERVAL when running e2e tests in ci/cd (07f3eee)
- persist targeting and placement selections in product editor (#689) (ebbecf0)
- populate custom targeting keys when editing products (#693) (88f0b9e)
- prevent duplicate IDs in placement display after removal (#696) (87b0eac)
- Prevent duplicate tenant display when user has both domain and email access (#660) (92ca049)
- product editor bugs - JSON parsing, text color, selection preservation (#694) (50765cf)
- rebase (581b18b)
- Reduce skipped tests from 323 to ~97 (70% improvement) (#669) (c48f978)
- rejection (79cb754)
- remove /a2a suffix from A2A endpoint URLs and add name field to configs (2b036c6)
- remove /a2a suffix from A2A endpoint URLs and add name field to configs (13914b8)
- remove 97% of type: ignore comments and fix 169 mypy errors (#820) (#823) (1175c63)
- Remove auto-restart of delivery simulators on server boot (#646) (52c2378)
- remove dead API docs link and fix testing docs path (#700) (9fd959e), closes #676
- Remove fake media_buy_id from pending/async responses in mock adapter (#658) (dc2a2ba)
- remove inventory sync requirement for mock adapter (#719) (4268b2e)
- Remove non-existent fields from SyncCreativesResponse (9bf3da7)
- Remove non-existent fields from SyncCreativesResponse (453c329)
- Remove non-existent impressions field from AdCPPackageUpdate (#500) (404c653)
- Remove non-spec tags field from ListAuthorizedPropertiesResponse (#643) (a38b3d7)
- Remove stale ui-test-assistant MCP server configuration (#851) (0e7cf9a)
- remove top-level budget requirement from create_media_buy (#725) (4474de3)
- Replace progress_data with progress in SyncJob (f4008f4)
- require authentication for sync_creatives and update_media_buy (#721) (defa383)
- Resolve GAM inventory sync and targeting data loading issues (#675) (ca31c6a)
- Resolve product creation and format URL issues (#756) (d99a6f8)
- Restore accidentally deleted commitizen configuration files (c92075c)
- Restore brand manifest policy migrations and merge with signals agent (e30c106)
- restore unrelative changes (8c159e6)
- Return human-readable text in MCP protocol messages (#644) (3bb9bce)
- Route external domains to tenant login instead of signup (#661) (b194b83)
- sales agent logic (0a51476)
- sanitize tenant ID in GCP service account creation (b4c3bbc)
- sanitize tenant ID in GCP service account creation (6774587)
- Set session role for super admin OAuth login (#654) (505b24f)
- set tenant context before fetching delivery metrics (1042274)
- Set tenant context when x-adcp-tenant header provides direct tenant_id (#467) (20b3f9c)
- show both name and ID for placements consistently (#695) (52caddd)
- signals agent test endpoint async handling (#718) (e1c5d72)
- Support ListCreativesRequest convenience fields with adcp 2.9.0 (#770) (1bd57f0)
- syntax (af504a6)
- Targeting browser, product page auth, UI repositioning + format conversion tests (#683) (d363627)
- targeting keys errors in browser and product pages (#685) (7fc3603)
- test (62c2fe0)
- test delivery webhook sends for fresh data (b35457f)
- test scase in test_format_conversion_approval (3060a24)
- tests (5d5347c)
- tests (1b1ce8e)
- tests (f70f684)
- tests (c966e43)
- try to pass delivery interval through docker-compose.override.yml for e2e tests (c830255)
- types (d545f14)
- typo in integration test (d09125e)
- Unskip 3 integration tests and reduce mypy errors by 330 (#627) (37cc165)
- Update DNS widget to use A record pointing to Approximated proxy IP (#636) (3291ae6)
- Update tenant selector template to work with dictionary objects (#652) (aa612a3)
- Use content-based hashing for schema sync to avoid metadata noise (#649) (5625955)
- use correct field name inventory_metadata in IDs path (4e7d7a2)
- Use SQLAlchemy event listener for statement_timeout with PgBouncer (#641) (bde8186)
- wrap service account credentials with GoogleCredentialsClient (#727) (9d21709)
- clarify GAM setup with three clear paths and environment validation (#847) (6a2e951)
- document PYTHONPATH requirement for Docker hot reload (#846) (03878f4)
- Changeset system for automated version management
- CI workflows to enforce changeset requirements on PRs
- Automated version bump PR creation when changesets are merged
0.1.0 - 2025-01-29
Initial release of the Prebid Sales Agent reference implementation.
- MCP server implementation with AdCP v2.3 support
- A2A (Agent-to-Agent) protocol support
- Multi-tenant architecture with PostgreSQL
- Google Ad Manager (GAM) adapter
- Mock ad server adapter for testing
- Admin UI with Google OAuth authentication
- Comprehensive testing backend with dry-run support
- Real-time activity dashboard with SSE
- Workflow management system
- Creative management and approval workflows
- Audit logging
- Docker deployment support
- Extensive documentation