v1.4.0#53
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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()gainednaics_codeandlist_psc()gainedhas_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.
ShapeParserwas rejectingEntity.display_name,entity_type,entity_structure,organization_structure,profit_structure,purpose_of_registration,country_of_incorporation,past_performance,registered,sba_business_types, andProtest.decisions,resolved_agency,resolved_protester— against an API that returns 200 for every one.list_entities(shape="display_name")raisedShapeValidationErrorand 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: truewith no tree is now a hard finding attributed upstream rather than a silent skip.Seven resources were never conformance-checked.
RESOURCE_TO_METHODomittedprotests,psc,mas_sins,departments,business_types, andassistance_listings, and mappedofficestoNonedespitelist_officesexisting. Wiring them up found the two new params above.CONTRACT_OMITTED_PARAMSis 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
mypy tango/strict: clean.ruff format --check: clean.pyproject.tomlandtango/__init__.py;import tangoreports1.4.0.ruff checkreports 23 errors, all pre-existing onmainin files this release doesn't touch.tests/production/test_production_smoke.py::test_search_filtersfails, and it is not flaky and not caused by this release — I reproduced it on unmodifiedmainbefore #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:contracts?awarding_agency=4700contracts?awarding_agency=9700contracts?fiscal_year=2024contracts?naics_code=541519contracts?search=cloudidvs?awarding_agency=4700grants?awarding_agency=4700So the filter works fine on other resources, and other filters work fine on contracts — it is specifically
awarding_agencyon 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
entityregression 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