Internal Lab
API Coverage & Reviewer Workflows
This is the internal research hub. It maps every backend API route to its frontend coverage status and links to the reviewer workflows. These tools are for authorized reviewers and developers only — they are not product surfaces.
Contract-wins research →
Experiment runs, evidence bundles, verification, processes, snapshots, and review pack signoff for the contract-wins signal family.
Issuer resolution review →
Resolution queue, candidate approval/rejection/supersede, mark-no-safe-match, reopen, and supplier mapping review actions.
Boundary: Cohort product pages live under
/issuers/* and /evidence/* and consume only the sanitized /api/issuers/* contract. Internal /api/internal/research/* endpoints must never appear in cohort pages.API Coverage Matrix
covered— a UI page or action calls this endpointhidden— endpoint exists but is intentionally not exposed as a pageloader— a loader function exists but no page calls it yet
System
| Method | API Route | Status | UI Route | Reason |
|---|---|---|---|---|
| GET | /api/health | hidden | — | System health probe; no user-facing page |
Contract-wins reads
| Method | API Route | Status | UI Route | Reason |
|---|---|---|---|---|
| GET | /api/internal/research/contract-wins/runs | covered | /research/contract-wins | Run list displayed on contract-wins reviewer page |
| GET | /api/internal/research/contract-wins/runs/{experiment_id} | covered | /research/contract-wins | Run detail shown on reviewer page |
| GET | /api/internal/research/contract-wins/evidence-bundles/{evidence_bundle_id:path} | covered | /research/contract-wins | Evidence bundle view on reviewer page |
| GET | /api/internal/research/contract-wins/verification | covered | /research/contract-wins | Verification summary on reviewer page |
| GET | /api/internal/research/contract-wins/processes | covered | /research/contract-wins | Process listing on reviewer page |
| GET | /api/internal/research/contract-wins/processes/{process_id} | hidden | — | Process rows are listed on the reviewer page; no separate process detail route is exposed |
| GET | /api/internal/research/contract-wins/snapshots | covered | /research/contract-wins | Snapshot listing on reviewer page |
| GET | /api/internal/research/contract-wins/snapshots/{snapshot_id} | hidden | — | Snapshot rows are listed on the reviewer page; no separate snapshot detail route is exposed |
| GET | /api/internal/research/contract-wins/review-packs | covered | /research/contract-wins | Review packs on reviewer page |
| GET | /api/internal/research/contract-wins/review-packs/{promotion_review_pack_id} | hidden | — | Review packs are listed on the reviewer page; no separate review-pack detail route is exposed |
Contract-wins actions
| Method | API Route | Status | UI Route | Reason |
|---|---|---|---|---|
| POST | /api/internal/research/contract-wins/review-packs/{promotion_review_pack_id}/signoff | covered | /research/contract-wins | Signoff action on reviewer page |
Issuer-resolution reads
| Method | API Route | Status | UI Route | Reason |
|---|---|---|---|---|
| GET | /api/internal/research/issuer-resolution/queue | covered | /research/issuer-resolution | Resolution queue on issuer-resolution page |
| GET | /api/internal/research/issuer-resolution/items/{source_id}/{issuer_group_id} | covered | /research/issuer-resolution | Resolution item detail |
Issuer-resolution actions
| Method | API Route | Status | UI Route | Reason |
|---|---|---|---|---|
| POST | /api/internal/research/issuer-resolution/items/{source_id}/{issuer_group_id}/refresh | covered | /research/issuer-resolution | Refresh action on issuer-resolution page |
| POST | /api/internal/research/issuer-resolution/items/{source_id}/{issuer_group_id}/approve | covered | /research/issuer-resolution | Approve action on issuer-resolution page |
| POST | /api/internal/research/issuer-resolution/items/{source_id}/{issuer_group_id}/supersede | covered | /research/issuer-resolution | Supersede action on issuer-resolution page |
| POST | /api/internal/research/issuer-resolution/items/{source_id}/{issuer_group_id}/reject | covered | /research/issuer-resolution | Reject action on issuer-resolution page |
| POST | /api/internal/research/issuer-resolution/items/{source_id}/{issuer_group_id}/mark-no-safe-match | covered | /research/issuer-resolution | Mark-no-safe-match action |
| POST | /api/internal/research/issuer-resolution/items/{source_id}/{issuer_group_id}/reopen | covered | /research/issuer-resolution | Reopen action on issuer-resolution page |
Supplier-mapping reads
| Method | API Route | Status | UI Route | Reason |
|---|---|---|---|---|
| GET | /api/internal/research/issuer-resolution/supplier-mappings/queue | covered | /research/issuer-resolution | Supplier mapping queue on issuer-resolution page |
| GET | /api/internal/research/issuer-resolution/supplier-mappings/items/{supplier_mapping_id} | covered | /research/issuer-resolution | Supplier mapping item detail |
Supplier-mapping actions
| Method | API Route | Status | UI Route | Reason |
|---|---|---|---|---|
| POST | /api/internal/research/issuer-resolution/supplier-mappings/items/{supplier_mapping_id}/approve | covered | /research/issuer-resolution | Approve supplier mapping action |
| POST | /api/internal/research/issuer-resolution/supplier-mappings/items/{supplier_mapping_id}/reject | covered | /research/issuer-resolution | Reject supplier mapping action |
| POST | /api/internal/research/issuer-resolution/supplier-mappings/items/{supplier_mapping_id}/mark-no-safe-match | covered | /research/issuer-resolution | Mark-no-safe-match for supplier mapping |
| POST | /api/internal/research/issuer-resolution/supplier-mappings/items/{supplier_mapping_id}/reopen | covered | /research/issuer-resolution | Reopen supplier mapping action |
Issuer-lifecycle internal
| Method | API Route | Status | UI Route | Reason |
|---|---|---|---|---|
| GET | /api/internal/research/issuer-lifecycle/issuers | hidden | — | Internal lifecycle listing; cohort pages consume the sanitized /api/issuers route instead |
| GET | /api/internal/research/issuer-lifecycle/issuers/{issuer_group_id} | hidden | — | Internal lifecycle detail; cohort pages consume the sanitized /api/issuers/{id} route instead |
| GET | /api/internal/research/issuer-lifecycle/issuers/{issuer_group_id}/processes | hidden | — | Internal lifecycle processes; cohort pages consume the sanitized /api/issuers/{id}/processes route instead |
Cohort issuer routes
| Method | API Route | Status | UI Route | Reason |
|---|---|---|---|---|
| GET | /api/issuers | covered | /issuers | Cohort issuer list page calls loadCohortIssuerList |
| GET | /api/issuers/mapping-confidence | covered | /issuers | Cohort issuer list page calls loadCohortMappingConfidenceList |
| GET | /api/issuers/{issuer_group_id} | covered | /issuers/[issuerGroupId] | Cohort issuer detail page calls loadCohortIssuerDetail |
| GET | /api/issuers/{issuer_group_id}/processes | loader | — | loadCohortIssuerProcesses exists but no page calls it yet |
| GET | /api/issuers/{issuer_group_id}/timeline | covered | /issuers/[issuerGroupId] | Cohort issuer detail page calls loadCohortIssuerTimeline |
| GET | /api/issuers/{issuer_group_id}/mapping-confidence | covered | /issuers/[issuerGroupId] | Cohort issuer detail page calls loadCohortIssuerMappingConfidence |
| GET | /api/issuers/evidence-bundles/{evidence_bundle_id:path} | loader | — | No page-level evidence bundle loading yet |