Skip to content

v1.4.0#53

Merged
vdavez merged 1 commit into
mainfrom
release/v1.4.0
Jul 20, 2026
Merged

v1.4.0#53
vdavez merged 1 commit into
mainfrom
release/v1.4.0

Conversation

@makegov-mark

@makegov-mark makegov-mark Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Release cut of everything merged since 1.3.0 — #52, plus the two API-side fixes it depends on (makegov/tango#2944 and #2948, both merged and deployed).

Why minor, not patch

list_protests() gained naics_code and list_psc() gained has_awards. Both are additive public-surface additions, so SemVer says minor. Nothing was renamed, removed, or narrowed.

What ships

13 fields the SDK used to reject client-side now validate. ShapeParser was rejecting Entity.display_name, entity_type, entity_structure, organization_structure, profit_structure, purpose_of_registration, country_of_incorporation, past_performance, registered, sba_business_types, and Protest.decisions, resolved_agency, resolved_protester — against an API that returns 200 for every one. list_entities(shape="display_name") raised ShapeValidationError and never issued the request. Two of those (registered, sba_business_types) had regressed in 1.3.0.

The reverse shape-coverage gate no longer goes blind. It skipped any resource with a falsy contract shape tree, which was exactly the seven resources it most needed to check. Re-vendoring the corrected contract surfaced 69 real gaps (36 fields, 20 expands, 13 flattened), all closed by a regenerated overlay. A resource declaring shape_supported: true with no tree is now a hard finding attributed upstream rather than a silent skip.

Seven resources were never conformance-checked. RESOURCE_TO_METHOD omitted protests, psc, mas_sins, departments, business_types, and assistance_listings, and mapped offices to None despite list_offices existing. Wiring them up found the two new params above.

CONTRACT_OMITTED_PARAMS is empty, which is the goal state. Both entries it ever held were retired by the self-cleaning warning added alongside it, once the upstream generator learned to publish them.

Verification

  • 366 unit tests, 124 integration (cassette) tests pass.
  • mypy tango/ strict: clean. ruff format --check: clean.
  • Conformance: exit 0, no errors. Shape coverage: 0 gaps, 0 baselined.
  • Version synced across pyproject.toml and tango/__init__.py; import tango reports 1.4.0.
  • ruff check reports 23 errors, all pre-existing on main in files this release doesn't touch.

⚠️ Unrelated production issue found while verifying

tests/production/test_production_smoke.py::test_search_filters fails, and it is not flaky and not caused by this release — I reproduced it on unmodified main before #52 landed.

/api/contracts/?awarding_agency= times out with a 504 after ~20.6s, consistently, across multiple agency codes. It is isolated to that one filter on that one endpoint:

request result
contracts?awarding_agency=4700 504, 20.6s
contracts?awarding_agency=9700 504, 20.5s
contracts?fiscal_year=2024 200, 0.1s
contracts?naics_code=541519 200, 0.1s
contracts?search=cloud 200, 1.7s
idvs?awarding_agency=4700 200, 2.1s
grants?awarding_agency=4700 200, 0.2s

So the filter works fine on other resources, and other filters work fine on contracts — it is specifically awarding_agency on the contracts endpoint. That is a common filter on the busiest endpoint, so it likely affects real traffic. Needs a tango-side issue; nothing to fix in the SDK.

After this releases

tango-mcp #64 unblocks: its entity regression clears, and its hand-maintained shape allowlists (79 fields behind the API) can finally be derived from a contract with no blind spots.

🤖 Generated with Claude Code

Minor bump: list_protests() gained naics_code and list_psc() gained
has_awards, both additive surface additions. Also ships the reverse
shape-coverage fix — 13 fields the SDK previously rejected client-side
against an API that accepts them now validate.

Version bumped in pyproject.toml and tango/__init__.py; [Unreleased]
promoted to [1.4.0] - 2026-07-20.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vdavez
vdavez merged commit 1fc111d into main Jul 20, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant