cbc-bridge-service — Jira-Ready Epics & User Stories
Status: populated Owner: Government / Emergency Last updated: 2026-04-21 Service prefix: CBC Scope: Cell-broadcast bridge to MNO RAN (3GPP TS 23.041) for civil emergency alerts. Government-PKI-authenticated, multi-language, geo-targeted, drill-capable. Per ADR-0004 §3 and
07-epics-and-user-stories.md§6.6.
Epic Summary
| Epic ID | Title | Stories | Points |
|---|---|---|---|
| EP-CBC-01 | 3GPP TS 23.041 Cell-Broadcast Adapter to MNO RAN | US-CBC-001 – US-CBC-006 | 39 |
| EP-CBC-02 | Government PKI Signature Verification on Broadcast Requests | US-CBC-007 – US-CBC-010 | 19 |
| EP-CBC-03 | Multi-Language Broadcast and Geographic Targeting | US-CBC-011 – US-CBC-014 | 21 |
| EP-CBC-04 | Broadcast Drill Mode + Public Test Channel | US-CBC-015 – US-CBC-017 | 11 |
| Total | 17 stories | 90 |
EP-CBC-01 · 3GPP TS 23.041 Cell-Broadcast Adapter to MNO RAN
Context: Bridge to MNO Cell Broadcast Entities (CBE) using standard 3GPP TS 23.041 where supported; vendor-specific adapters (Ericsson, Huawei) where not. Reaches every handset in the targeted area within seconds.
US-CBC-001 · Submit emergency broadcast via gRPC
Type: Feature | Points: 8
Description:
As an authorised Civil Defence operator, I need a gRPC BroadcastEmergency method to submit a prioritised broadcast so that it reaches every handset in the targeted area within seconds.
Acceptance Criteria:
- gRPC
BroadcastEmergency(req)accepts{ headline, body { en, fa, ps, ar }, geoTarget, severity, expiry, channelClass } - Caller mTLS client cert from a recognised national-PKI authority (verified per US-CBC-007)
- On accept → returns
broadcastId, acceptedAt, expectedDispatchBy(≤ 60 s) - Persists
cbc.broadcastsrow with statusACCEPTED - Publishes
cbc.broadcast.requested.v1to NATS within 1 s - Failure cases: bad signature →
UNAUTHENTICATED; missing required language fields →INVALID_ARGUMENT
US-CBC-002 · Translate request to 3GPP TS 23.041 CBS PDU
Type: Feature | Points: 8
Description: As the cbc-bridge-service, I need to translate the broadcast request into 3GPP TS 23.041 CBS message PDUs per MNO so the MNO CBE can accept and broadcast natively.
Acceptance Criteria:
- CBS message identifier set per
severity(P0=4370, P1=4371, P2=4372) - DCS UCS-2 for Pashto/Dari/Arabic; GSM7 for English
- Page count computed (max 93 chars/page UCS-2; 82 GSM7); multi-page concatenation per spec
- Geographic scope encoded per Cell-ID list, polygon, or country-code list
- Conformance unit tests: 100 sample bodies × 4 languages round-trip
US-CBC-003 · Per-MNO CBE adapter dispatch
Type: Feature | Points: 8
Description: As the cbc-bridge-service, I need to dispatch the broadcast to all MNO CBE endpoints in parallel via per-MNO adapters so all operators broadcast within seconds of each other.
Acceptance Criteria:
- Adapters:
Standard3gppCbeAdapter,EricssonProprietaryCbeAdapter,HuaweiProprietaryCbeAdapter - Parallel dispatch with 30 s per-MNO timeout
- Each MNO row in
cbc.mno_dispatcheswith statusPENDING → DISPATCHED → ACKED|FAILED|TIMEOUT - Per-MNO Vault credentials at
secret/cbc/mno/{mno-id}/cbe-credentials - Metric
cbc_dispatch_latency_seconds{mno}histogram; alert P95 > 30 s
US-CBC-004 · Aggregate per-MNO acknowledgements + final status
Type: Feature | Points: 5
Description: As the cbc-bridge-service, I need to aggregate per-MNO acks and compute a final broadcast status so the government caller sees one coherent result with per-MNO breakdown.
Acceptance Criteria:
- Status =
DELIVEREDif all MNOsACKED;PARTIALif mixed;FAILEDif all failed - Final status published
cbc.broadcast.acked.v1with per-MNO JSON breakdown -
GetBroadcastStatus(broadcastId)returns live status - Status transition audit-logged
US-CBC-005 · Cancel pending broadcast (dual-control)
Type: Feature | Points: 5
Description: As an authorised Civil Defence operator, I need to cancel a pending broadcast within the dispatch window with dual-control approval so a mistaken alert can be retracted.
Acceptance Criteria:
-
CancelBroadcast(broadcastId)requires a second authorised caller's PKI signature within 60 s - Cancellation only effective for MNOs in
PENDINGorDISPATCHED - Cancellation audit-logged with both initiator and approver IDs
- Status transitions to
CANCELLEDwith per-MNO breakdown
US-CBC-006 · Hash-chained immutable broadcast audit log
Type: Feature | Points: 5
Description: As a regulator auditor, I need to verify integrity of every historical broadcast via a hash chain so tampering is detectable.
Acceptance Criteria:
- Each
cbc.broadcastsrow carriesprev_hashandrecord_hash = sha256(payload || prev_hash) -
cbc.audit.v1published withrecord_hashfor every transition -
GET /v1/cbc/broadcasts/:id/auditreturns full chain - Cron daily verifies last 24 h chain integrity; alert on break
EP-CBC-02 · Government PKI Signature Verification on Broadcast Requests
Context: Broadcast authority must be loud and verifiable. Every request carries a national-PKI signature; verification is HSM-bound; in-process key fallback forbidden.
US-CBC-007 · National-PKI signature verification (HSM-bound)
Type: Feature | Points: 8
Description:
As a security engineer, I need every BroadcastEmergency request signed by a recognised national-PKI cert with HSM-bound verification so only authorised government clients can broadcast.
Acceptance Criteria:
-
X-Gov-Signatureheader carries detached PKCS#7 signature over canonicalised request body - Verified via HSM (PKCS#11) against national-PKI CA chain — no in-process key fallback
- Verification result logged to
cbc.signature_audit - Failed verification →
UNAUTHENTICATED; rate > 1/min → alert (probing detection)
US-CBC-008 · Caller-cert revocation honoured (CRL/OCSP)
Type: Feature | Points: 5
Description: As a security engineer, I need CRL and OCSP-stapled revocation honoured on caller certs so a revoked government cert cannot broadcast.
Acceptance Criteria:
- CRL pulled every 4 h; cached in Redis
- OCSP-stapled response checked on every TLS handshake
- Revoked cert → connection rejected at TLS layer; audit row written
- Cache miss + URL unreachable → fail-closed
US-CBC-009 · Authorised-caller registry
Type: Feature | Points: 3
Description: As a platform admin, I need a registry of authorised government callers so authorisation is explicit, not implicit-by-cert-validity.
Acceptance Criteria:
-
cbc.authorised_callers(orgName, certSubject, allowedSeverities[], allowedRegions[], notBefore, notAfter, mou_ref) - Admin REST CRUD; immutable history
-
BroadcastEmergencyrejected if caller cert subject not in registry, even if signature valid
US-CBC-010 · Signature-audit dashboard
Type: Feature | Points: 3
Description: As a security engineer, I need a dashboard of signature verifications so probing attacks or cert misconfigurations are detected.
Acceptance Criteria:
- Grafana panel: success/fail rate per hour, top failing cert subjects
- Alert when failure rate > 10/h
- Linked runbook
runbooks/cbc-signature-failures.md
EP-CBC-03 · Multi-Language Broadcast (Pashto/Dari/Arabic/English) and Geographic Targeting
US-CBC-011 · Multi-language body required for every broadcast
Type: Feature | Points: 5
Description: As a Civil Defence operator, I need to provide the broadcast body in Pashto, Dari, Arabic, and English in a single request so all linguistic communities receive the alert.
Acceptance Criteria:
-
body { en, fa, ps, ar }— at leasten+ one offa/psmandatory; bothfa+psmandatory for severity P0 - Each language page-counted independently per encoding (UCS-2 vs GSM7)
- MNO CBE receives one CBS message per language with proper DCS
- Translation memory link to
customer-portallocalisation glossary (EP-CUST-09)
US-CBC-012 · Geographic targeting modes (cell IDs, polygon, region)
Type: Feature | Points: 8
Description: As a Civil Defence operator, I need to target by Cell-ID list, polygon, or named region so alerts are scoped to the actual hazard area.
Acceptance Criteria:
- Targeting modes:
cell_ids[],polygon(GeoJSON),region(province/district),country(default) - Polygon → resolved to Cell-ID list via cached MNO cell-tower coordinates
- Each mode produces a per-MNO Cell-ID list at dispatch time
- Validation: polygon area > national area → reject; unknown cell IDs → reject with detail
US-CBC-013 · Cell-tower coordinate refresh from MNOs
Type: Feature | Points: 5
Description: As a platform engineer, I need to refresh per-MNO cell-tower coordinate datasets weekly so polygon targeting remains accurate.
Acceptance Criteria:
- Cron weekly fetches from each MNO's cell-database export endpoint; manual upload fallback
- Stored in
cbc.mno_cell_database(mno, cellId, lat, lng, accuracy, lastUpdated) - Coverage report: % of national area covered by known cells per MNO
US-CBC-014 · Severity-based delivery prioritisation
Type: Feature | Points: 3
Description: As a Civil Defence operator, I need severity (P0 extreme, P1 major, P2 advisory) to drive priority handling at MNO CBE so catastrophic alerts pre-empt routine ones.
Acceptance Criteria:
- Severity → CBS Message Identifier mapping (per US-CBC-002)
- P0 sets MNO CBE priority flag where supported
- Severity escalation (P1 → P0 promotion) requires second-approver
EP-CBC-04 · Broadcast Drill Mode + Public Test Channel
US-CBC-015 · Drill mode with "DRILL" prefix
Type: Feature | Points: 5
Description: As a platform admin, I need to run a drill broadcast in the test Message Identifier range with a "DRILL" prefix in every language so drills are unmistakable.
Acceptance Criteria:
-
POST /v1/cbc/drillwith body, geoTarget, scheduledAt - CBS Message Identifier in test range (4370..4379, designated test slot)
- Body prefixed with localised "DRILL — NO ACTION REQUIRED" per language
- Drill rows tagged
is_drill=true; never produce ATRA-reporting events
US-CBC-016 · Drill scheduling + after-action report
Type: Feature | Points: 3
Description: As a platform admin, I need to schedule monthly drills and receive an after-action report so the CBC pipeline is continuously validated.
Acceptance Criteria:
- Cron schedule configurable; default monthly (first Tuesday 10:00 Asia/Kabul)
- After-action report emailed to NDMA + Ghasi NOC
- Report includes per-MNO ack latency, dispatched cells count, partial-failure breakdown
US-CBC-017 · Public test channel for media partners
Type: Feature | Points: 3
Description: As a media partner, I want to subscribe to a public test channel so I can verify Ghasi's emergency-broadcast capability and maintain public confidence.
Acceptance Criteria:
- A pre-registered Test channel where drills also publish as a non-emergency push (in-app / web)
- Public dashboard
https://status.ghasi.io/cbc-drillsshows last 12 months of drill records - Subscribers via HMAC-signed webhook receive drill-result feed