Added
-
list_protests()now acceptsnaics_code, filtering protests by the solicitation's NAICS code. The API has always supported it (verified live: 15,027 protests unfiltered, 12 for541519, 2 for336411), butprotestswas absent from the conformance checker's resource-to-method map, so the gap was never reported. -
list_psc()now acceptshas_awards, restricting results to codes with contract award history (2,526 PSC codes unfiltered, 2,243 with awards).Falseis sent explicitly rather than dropped, since the API distinguishes the two. This param has always worked but was invisible to the contract until makegov/tango#2948 added theview_handled_paramsdeclaration for params a viewset reads straight fromquery_params. That PR also fixed a truthiness bug wherehas_awards=falsefiltered identically totrue, and is deployed — verified live at 2,526 forFalseand 2,243 forTrue.One caveat that is not an SDK issue:
/api/psc/responses are cached for 30 days per query-param key, so any?has_awards=key requested before that deploy still serves the old awards-only result until its entry expires or is invalidated.
Fixed
-
The reverse shape-coverage gate was blind to seven resources, and the SDK's schemas had silently drifted behind four of them. The gate skipped any resource whose contract shape tree was falsy (
if not shape: continue). Tango published"shape": nullforentities,opportunities,notices,protests,itdashboard,events, andnews— five of them because its contract generator crashed on tier-aware viewsets (makegov/tango#2944) — so the gate reported full coverage while checking nothing for them. Re-vendoring the fixed contract surfaced 69 real gaps (36 fields, 20 expands, 13 flattened expands) across entities, notices, protests, and itdashboard, all now closed by a regenerated overlay.The user-visible consequence was worse than missing schema entries. Because
ShapeParservalidates client-side, the SDK rejected 13 fields the API accepts, before ever issuing a request —list_entities(shape="display_name")raisedShapeValidationErroragainst an endpoint that returns 200 for it. Affected:Entity'sdisplay_name,entity_type,entity_structure,organization_structure,profit_structure,purpose_of_registration,country_of_incorporation,past_performance,registered,sba_business_types, andProtest'sdecisions,resolved_agency,resolved_protester. All 13 now validate. Note thatregisteredandsba_business_typesregressed in 1.3.0 — they validated under 1.1.1 — so the overlay generation had narrowedEntitywhile nothing was watching.The gate no longer skips silently: a resource declaring
shape_supported: truewith no shape tree is now a hard finding (contract_missing_shape) reported as an upstream contract defect rather than an SDK one. Contracts predatingschema_version: 2omit the key, where a null tree stays genuinely ambiguous and skipping remains correct. -
Seven resources with working SDK methods were never conformance-checked at all.
RESOURCE_TO_METHODomittedprotests,psc,mas_sins,departments,business_types, andassistance_listingsentirely, and mappedofficestoNoneas "not yet implemented" even thoughlist_officesexists. Their filter coverage had never been validated. Wiring them up found one real gap (protests.naics_code, above); the other six were already complete.eventsandnewsstay mapped toNone— genuinely absent from the SDK, now with a note explaining thatlist_webhook_event_typesis unrelated. -
refresh_contract.py+probe_shape_types.pyre-run against the corrected contract.contracts/observed_shape_types.jsongained live-sampled types for the five newly-visible resources (entities alone contributes 136 observed paths), so the regenerated overlay resolves their types from real API responses rather than name heuristics.
Changed
CONTRACT_OMITTED_PARAMSnow warns when an entry is no longer needed, mirroring how baseline entries are burned down, and the list is now empty — which is the goal state. It briefly heldmas_sins: search, added because the API applies it (330 results unfiltered, 0 for a nonsense term, 32 foroffice) while the contract recordedfilter_params: [], so the checker would otherwise have flagged a working parameter as a silent no-op and invited its removal. Both that entry andbudget/accounts: searchwere retired by the new warning once makegov/tango#2944 and #2948 taught the contract generator to publish them. The carve-out mechanism stays for the next such case.