Add per-test-case result endpoints. Auto-upserts new test cases when external_id is supplied but test_case_id is not — letting frameworks "discover" tests in BGSTM without pre-registration.
Parent: #291
Depends on: router skeleton sub
Endpoints
POST /api/v1/external-results/case
PATCH /api/v1/external-results/case/{id}
GET /api/v1/external-results/case/{id}
Auto-upsert rules
test_case_id supplied + exists: link to it
test_case_id supplied + missing: 404
- Only
external_id supplied: lookup by (project_id, external_id). Found → link. Not found → create with auto_registered=true
- Neither supplied: 422
Traceability auto-link
If requirement_ids: [...] provided, write idempotent entries into the existing traceability table.
Status transition rules
started → any
passed/failed/skipped → only flaky (re-classification)
aborted → terminal
- Violations return 409
Acceptance criteria
Out of scope
- Artifacts (separate sub)
- Audit log (separate sub)
Add per-test-case result endpoints. Auto-upserts new test cases when
external_idis supplied buttest_case_idis not — letting frameworks "discover" tests in BGSTM without pre-registration.Parent: #291
Depends on: router skeleton sub
Endpoints
POST /api/v1/external-results/casePATCH /api/v1/external-results/case/{id}GET /api/v1/external-results/case/{id}Auto-upsert rules
test_case_idsupplied + exists: link to ittest_case_idsupplied + missing: 404external_idsupplied: lookup by(project_id, external_id). Found → link. Not found → create withauto_registered=trueTraceability auto-link
If
requirement_ids: [...]provided, write idempotent entries into the existingtraceabilitytable.Status transition rules
started→ anypassed/failed/skipped→ onlyflaky(re-classification)aborted→ terminalAcceptance criteria
test_case_idauto_registered=truerequirement_idstriggers idempotent inserts intotraceabilityexternal_case_resultstableOut of scope