Skip to content

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

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 disputes under an existing award, not bid protests — those stay on listProtests.

client.listContractAppeals(options?: ListContractAppealsOptions): Promise<PaginatedResponse<...>>
client.getContractAppeal(uuid: string, options?: { shape?, flat?, flatLists?, joiner? }): Promise<ContractAppealRecord>
  • ListContractAppealsOptions extends the shared list options and names all ten filters: search, board, docket, appellant, judge, decision_type, decision_date_after / _before, listed, document_id, plus ordering.
  • ContractAppealRecord types the 21 response fields, all optional: an unshaped list response carries only a core subset, so an unrequested field is absent rather than null. decision_text is Enterprise-gated and absent below that tier.
  • CONTRACT_APPEAL_SCHEMA is registered as the ContractAppeal model, and both conformance scripts learn the resource → method / model mapping.
  • Response fields keep the repo's snake_case convention (docket_numbers), matching ProtestRecord; camelCase stays for method and option names.

Testing

Gate Result
npx vitest run 430 passed across 47 files, 34 new
npm run typecheck clean
npm run lint clean
npm run check-conformance no errors, only pre-existing warnings
npm run check-shape-coverage 0 new gaps
npm run build clean

New tests cover list with filters, listed: false surviving rather than being dropped, no synthesized shape, explicit shape passthrough, retrieve by uuid, empty-uuid rejection before any request, and decision_text present vs. absent-not-null.

Notes

  • Unit tests rather than a cassette. The integration suite replays recorded cassettes and a missing one is a hard failure; recording needs a live call. This mirrors tests/unit/client.sled.test.ts, the repo's other full-resource unit suite. A cassette can be recorded in a later refresh.
  • No shape preset. Presets are pinned to tango-python by a parity test, so inventing one here before Python picks its field list would create drift — and listProtests does not send its preset either.
  • Uses the generic list path, like listProtests. The shaped path validates against the local schema and would reject a caller's shape client-side for a resource whose shape tree is not in the vendored contract yet. The schema is still registered so the coverage gate has a model at the next re-vendor.
  • The two script mappings are inert today — the vendored contract is API 4.25.1 and has no contract_appeals — and exist so the next re-vendor does not hard-fail on an unmapped resource.
  • npm run format is unsafe here: it rewrites ~35 unrelated files. It was reverted; only the 10 files above are touched. Two of them already fail prettier --check at HEAD, before this change, and were left alone rather than smuggling a whole-file reformat into this diff.
  • No version bump — the release flow bumps at release time and the contributor guide asks only for an ## [Unreleased] entry.

🤖 Generated with Claude Code

`listContractAppeals` and `getContractAppeal` cover `/api/contract_appeals/`, the Contract Disputes Act decisions of the civilian and defense boards of contract appeals.
`ContractAppealRecord` types the 21 response fields as optional, so a `decision_text` withheld below Enterprise stays absent rather than null.
The vendored contract already carries this resource, so wrapping it maps `contract_appeals` in the conformance gate and removes it from both coverage baselines.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@vdavez
vdavez force-pushed the feat/contract-appeals branch from f1618bc to 68e97d4 Compare September 23, 2026 13:47
@vdavez
vdavez marked this pull request as ready for review September 23, 2026 13:48
@vdavez
vdavez merged commit 5b673c5 into main Sep 23, 2026
7 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