Repository navigation
feat(contract-appeals): add the contract appeals resource - #65
Merged
Merged
Conversation
`list_contract_appeals` and `get_contract_appeal` cover `/api/contract_appeals/`, the Contract Disputes Act decisions of the civilian and defense boards of contract appeals, with all ten filters as named parameters and a 21-field `ContractAppeal` model whose fields are optional so a withheld `decision_text` stays absent rather than null. The vendored contract already carries this resource, so wrapping it removes `contract_appeals` from the shape-coverage baseline. The shape schema is hand-curated because the overlay generator guesses four of these fields wrong, and the generated overlay wins at lookup time. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
vdavez
force-pushed
the
feat/contract-appeals
branch
from
September 23, 2026 13:35
5e23b8b to
70d8209
Compare
vdavez
marked this pull request as ready for review
September 23, 2026 13:40
Merged
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.
What
Adds the
contract_appealsresource, new in Tango API 4.26.0: Contract Disputes Act appeal decisions from the Civilian Board of Contract Appeals (CBCA, 2007 onward) and the Armed Services Board of Contract Appeals (ASBCA, 2010 onward). These are disputes under an existing award, not bid protests — those stay on the protests methods.list_contract_appeals(...)andget_contract_appeal(appeal_id, ...). All ten filters are named parameters:board,docket,appellant,judge,decision_type,decision_date_after/_before,listed,document_id,search, plusorderingand the shared page / limit / shape options.ContractAppealmodel, 21 fields, all optional: an unshaped list response carries only a core subset, so an unrequested field is absent rather than null.decision_textis Enterprise-gated and absent below that tier.ShapeConfig.CONTRACT_APPEALS_MINIMALand..._COMPREHENSIVE, mirroring the API's own list and retrieve defaults. Neither namesdecision_text, and a test pins that.Two changes beyond the endpoint, both deliberate
delisted_at,meta(jurisdiction_declared)) that the SDK had been rejecting client-side. Both gates still report zero errors and zero new drift, and nothing was added to the baseline. Everything ran off a local checkout, with no network.ContractAppeal's shape schema is hand-curated rather than left to the generated overlay. The generator falls back to name heuristics for a resource it has not sampled, and it got four fields wrong —docket_numbersas a scalar,listedanddecision_date_repairedas strings,listing_yearas a string. The overlay wins at lookup time, so those guesses would have mis-parsed real responses. Curating the base also makes the generator emit nothing here, so a later regeneration cannot reintroduce them.Testing
pytest: 512 passed, 31 skipped, 15 new.mypy tango/(strict): clean.ruff format --checkandruff checkon the gate's scope: clean.check_filter_shape_conformance.py: 0 errors, andcontract_appealsnow maps, so every API filter is confirmed present with a compatible annotation.check_shape_coverage.py: 0 new drift.listed=Falsesurviving rather than being dropped, the limit cap, retrieve by uuid,decision_textpresent and absent, and shape validation. Mutation-checked: dropping thelistedparameter and swapping the retrieve default shape each broke the expected tests.Notes
## [Unreleased], and a separate release PR bumps the version and dates the section.query_typeis a plainstr), soalerts.contract_appeal.matchis documented rather than added as a constant. Thecreate_webhook_alertdocstring was already stale — it omitted exclusions, both DIBBS types and SLED — and now names the current set and points atlist_webhook_event_types()as the authority.joinerparameter: the API advertises it, but the closest analogs (protests, SLED, DIBBS, SBIR, exclusions) do not expose it, so this follows them.🤖 Generated with Claude Code