Skip to content

feat(contract-appeals): add the contract appeals resource - #5

Merged
vdavez merged 1 commit into
mainfrom
feat/contract-appeals
Sep 23, 2026
Merged

vdavez merged 1 commit into
mainfrom
feat/contract-appeals

Conversation

@makegov-mark

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

Copy link
Copy Markdown
Contributor

What

Adds the contract_appeals resource, new in Tango API 4.26.0: Contract Disputes Act appeal decisions from the Civilian Board of Contract Appeals (CBCA, 2007–present) and the Armed Services Board of Contract Appeals (ASBCA, 2010–present). These are contract disputes under an existing award, not bid protests — those stay on the protests resource.

  • Client::list_contract_appeals(opts), Client::get_contract_appeal(uuid, opts), Client::iterate_contract_appeals(opts).
  • ListContractAppealsOptions (bon-derived, #[non_exhaustive]) names all ten filters — search, board, docket, appellant, judge, decision_type, decision_date_after / _before, listed, document_id — plus ordering and the shared pagination and shape options. listed is Option<bool>, so listed(false) reaches the server as a filter instead of collapsing into the default.
  • models::ContractAppealRecord types all 21 response fields. Every field is Option<...> with skip_serializing_if, matching ProtestRecord: an unshaped list response carries only a core subset, so an unrequested field is absent rather than null. Unknown fields fall through to extra.
  • SHAPE_CONTRACT_APPEALS_MINIMAL deliberately omits decision_text, which is Enterprise-gated, the way the SLED shapes withhold their paid leaf. A test pins that.

Testing

  • cargo test --workspace: 204 passed in the main crate, 12 of them new, plus the transport, webhooks and doctest targets. Green.
  • cargo clippy --workspace --all-features -- -D warnings and cargo fmt --all -- --check: clean. just ci green end to end.
  • The new tests mirror the protests set, plus four this resource earns: listed(false) emits rather than vanishing; a decode with decision_text; a decode without it that asserts None, that the key did not leak into extra, and that text_status / text_char_count still report the text exists; and a serialize round-trip proving absent keys are not reintroduced.
  • Nothing touched the network: the integration suite is #[ignore]d and was not run.

Notes

  • No version bump. Releases here are tag-driven and the checklist asks only for an ## [Unreleased] entry, which is the precedent the SLED resource set.
  • Alert types are not modeled in this SDK — query_type and event_types are free-form strings with no roster — so contract_appeal / alerts.contract_appeal.match is documented in docs/WEBHOOKS.md rather than added as a constant. Typing them would be its own change across all four SDKs.
  • Pre-existing and left alone: the shape-preset count in README.md, docs/SHAPES.md and docs/API_REFERENCE.md was already stale before this branch (the SLED resource added five constants without updating it). Fixing it is catching the SDK up, not adding this endpoint.

🤖 Generated with Claude Code

`list_contract_appeals`, `get_contract_appeal` and `iterate_contract_appeals` cover `/api/contract_appeals/`, the Contract Disputes Act decisions of the civilian and defense boards of contract appeals.
`ListContractAppealsOptions` carries all ten filters, `ContractAppealRecord` types the 21 response fields, and `SHAPE_CONTRACT_APPEALS_MINIMAL` withholds the Enterprise-gated decision text the way the other paid-leaf shapes do.

Tango API 4.26.0.
@vdavez
vdavez force-pushed the feat/contract-appeals branch from 323e978 to 7162d81 Compare September 23, 2026 13:52
@vdavez
vdavez marked this pull request as ready for review September 23, 2026 13:53
@vdavez
vdavez merged commit 82c24eb into main Sep 23, 2026
9 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