Skip to content

Commit 5be89dc

Browse files
authored
docs: update BIAN references from v13 to v14 (#1299)
1 parent ce8c854 commit 5be89dc

26 files changed

Lines changed: 113 additions & 59 deletions

api/proto/meridian/market_information/v1/market_information.proto

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ message ObservationRecorded {
327327
// ========================================
328328

329329
// MarketInformationService provides operations for managing market data sets,
330-
// observations, and data sources following BIAN v13.0 Market Information Management.
330+
// observations, and data sources following BIAN v14.0 Market Information Management.
331331
service MarketInformationService {
332332
// ----------------------------------------
333333
// Data Set Operations

docs/adr/0002-microservices-per-bian-domain.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ Core domains (FinancialAccounting, PositionKeeping) in monolith, customer-facing
121121
## Links
122122

123123
* [BIAN Service Landscape](https://bian.org/servicelandscape/)
124-
* [BIAN Semantic APIs](../../../bian/bian-public-main/release13.0.0/semantic-apis/)
124+
* [BIAN Semantic APIs](../../../bian/bian-public-main/release14.0.0/semantic-apis/)
125125
* [GitHub Issue #1: Infrastructure](https://github.com/meridianhub/meridian/issues/1)
126126
* [GitHub Issue #3: Platform Services](https://github.com/meridianhub/meridian/issues/3)
127127

docs/adr/0004-event-schema-evolution.md

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ Supersedes initial decision to use Confluent Schema Registry.
2626

2727
Amended: 2025-11-19 - Added event topic naming convention, outbox pattern, and idempotency pattern
2828

29+
Amended: 2026-02-28 - Added BIAN v14 AsyncAPI specification awareness
30+
2931
## Context
3032

3133
Meridian uses Apache Kafka for internal coordination between BIAN service domains. Events represent domain state
@@ -382,7 +384,7 @@ fields handle 90% of evolution needs. New event types handle the remaining 10% (
382384
- [ADR-0006: Schema Management with Adapters](./0006-schema-management-adapters.md)
383385
- [Protocol Buffers Language Guide](https://protobuf.dev/programming-guides/proto3/)
384386
- [buf CLI Documentation](https://buf.build/docs/)
385-
- [BIAN Service Landscape 13.0.0](https://bian.org/servicelandscape-13-0-0/)
387+
- [BIAN Service Landscape 14.0.0](https://bian.org/servicelandscape-14-0-0/)
386388
- [BIAN Semantic APIs](https://bian.org/semantic-apis/)
387389

388390
## Notes
@@ -1034,3 +1036,55 @@ func TestIdempotency(t *testing.T) {
10341036
- [Event-Driven Architecture: Idempotent Consumers](../architecture/event-driven-architecture.md#idempotent-consumers)
10351037
- [Outbox Pattern Amendment](#amendment-outbox-pattern-for-reliable-event-publishing-2025-11-19)
10361038
- [CurrentAccount API Contract: Idempotency](../architecture/api-contracts/current-account-contract.md#idempotency)
1039+
1040+
---
1041+
1042+
## Amendment: BIAN v14 AsyncAPI Specification Awareness (2026-02-28)
1043+
1044+
### Context
1045+
1046+
BIAN v14.0.0 introduces formal [AsyncAPI 3.0.0](https://www.asyncapi.com/docs/reference/specification/v3.0.0) specifications for all 259 service domains. This is the first time BIAN has provided machine-readable event definitions alongside its existing OpenAPI (REST) specs. Each service domain now includes an AsyncAPI YAML defining channels with `Created` and `Updated` message patterns (e.g., `OutboundMessage/Created`, `OutboundMessage/Updated`).
1047+
1048+
**Example (BIAN AsyncAPI for CurrentAccount):**
1049+
1050+
```yaml
1051+
channels:
1052+
OutboundMessage/Created:
1053+
messages:
1054+
CurrentAccountOutbound:
1055+
payload:
1056+
$ref: '#/components/schemas/CurrentAccountOutbound'
1057+
OutboundMessage/Updated:
1058+
messages:
1059+
CurrentAccountOutbound:
1060+
payload:
1061+
$ref: '#/components/schemas/CurrentAccountOutbound'
1062+
```
1063+
1064+
**BIAN's approach is transport-agnostic**: channel names like `OutboundMessage/Created` are abstract and don't prescribe Kafka topic names, message broker topology, or serialization format.
1065+
1066+
### Decision
1067+
1068+
Acknowledge BIAN AsyncAPI specs as a **reference for payload structure** but continue using Meridian's existing topic naming convention (`<service>.<event-name>.<version>`) and protobuf serialization.
1069+
1070+
**Rationale:**
1071+
1072+
1. **Topic naming**: Meridian's dot-notation convention (`current-account.account-created.v1`) encodes service ownership directly in the topic name, which is operationally valuable for filtering, access control, and debugging. BIAN's `OutboundMessage/Created` channel naming is transport-agnostic and doesn't provide this operational benefit.
1073+
1074+
2. **Payload alignment**: BIAN AsyncAPI schemas define JSON payloads matching the OpenAPI models. Meridian's Kafka events use protobuf serialization (per this ADR) with domain-specific event types rather than generic `ServiceDomainOutbound` wrappers. Our adapter layer (ADR-0005) handles the translation between BIAN's model structure and Meridian's internal event schemas.
1075+
1076+
3. **Serialization**: BIAN AsyncAPI specs assume JSON payloads. Meridian uses protobuf for type safety, performance, and consistency with gRPC APIs (per this ADR's original decision). This remains the correct choice for internal event coordination.
1077+
1078+
4. **Granularity**: BIAN defines two channels per domain (Created/Updated). Meridian uses fine-grained event types per BIAN behavior qualifier (AccountCreated, AccountSuspended, TransactionInitiated, etc.), which provides better consumer filtering and clearer domain semantics.
1079+
1080+
### Future Considerations
1081+
1082+
- **Payload structure review**: When implementing new service domains, cross-reference BIAN AsyncAPI payload schemas to ensure Meridian's protobuf event fields capture equivalent domain data.
1083+
- **External integration**: If Meridian ever exposes event streams to external consumers, BIAN AsyncAPI specs could inform the external-facing contract while the internal protobuf events remain unchanged.
1084+
- **BIAN evolution**: Monitor future BIAN releases for more prescriptive async patterns (e.g., CloudEvents envelope, transport-specific bindings) that may warrant revisiting this position.
1085+
1086+
### References
1087+
1088+
- [BIAN v14 AsyncAPI Specs](https://github.com/bian-official/public/tree/main/release14.0.0/semantic-apis/asyncapi)
1089+
- [BIAN v14.0 Release Notes](https://bian.org/wp-content/uploads/2025/01/BIAN-v14.0-Release-Notes-v1.0.pdf)
1090+
- [Topic Naming Amendment](#amendment-event-topic-naming-convention-2025-11-19)

docs/adr/0005-adapter-pattern-layer-translation.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -350,20 +350,20 @@ changes.
350350

351351
### Scenario: BIAN Adds New Behavior Qualifier
352352

353-
#### BIAN 13.0 → 14.0 adds "Suspend" to Current Account
353+
#### BIAN 14.0 → 15.0 adds "Suspend" to Current Account
354354

355355
#### Step 1: Update domain model (business logic)
356356

357357
```go
358358
// internal/domain/current_account.go
359359

360-
// Updated for BIAN 14.0
360+
// Updated for BIAN 15.0
361361
type CurrentAccount struct {
362362
ID uuid.UUID
363363
ControlRecordID string
364364
AccountStatus AccountStatus
365365

366-
// New in BIAN 14.0
366+
// New in BIAN 15.0
367367
SuspensionReason string
368368
SuspendedUntil time.Time
369369
SuspendedBy string
@@ -377,7 +377,7 @@ const (
377377
AccountStatusSuspended AccountStatus = "suspended" // New
378378
)
379379

380-
// New BIAN 14.0 behavior qualifier
380+
// New BIAN 15.0 behavior qualifier
381381
func (a *CurrentAccount) Suspend(reason string, until time.Time, by string) error {
382382
if a.AccountStatus != AccountStatusActive {
383383
return ErrInvalidStatusTransition
@@ -401,7 +401,7 @@ type CurrentAccountEntity struct {
401401
// ... existing fields
402402
AccountStatus string `gorm:"not null;size:50;index"`
403403

404-
// BIAN 14.0 fields (nullable for backward compatibility)
404+
// BIAN 15.0 fields (nullable for backward compatibility)
405405
SuspensionReason *string `gorm:"size:500"`
406406
SuspendedUntil *time.Time `gorm:"index"`
407407
SuspendedBy *string `gorm:"size:255"`
@@ -414,7 +414,7 @@ func (r *CurrentAccountRepository) toEntity(d *domain.CurrentAccount) *CurrentAc
414414
AccountStatus: string(d.AccountStatus),
415415
}
416416

417-
// Map BIAN 14.0 fields (conditional based on status)
417+
// Map BIAN 15.0 fields (conditional based on status)
418418
if d.AccountStatus == domain.AccountStatusSuspended {
419419
entity.SuspensionReason = &d.SuspensionReason
420420
entity.SuspendedUntil = &d.SuspendedUntil
@@ -431,7 +431,7 @@ func (r *CurrentAccountRepository) toDomain(e *CurrentAccountEntity) *domain.Cur
431431
AccountStatus: domain.AccountStatus(e.AccountStatus),
432432
}
433433

434-
// Map BIAN 14.0 fields if present
434+
// Map BIAN 15.0 fields if present
435435
if e.SuspensionReason != nil {
436436
account.SuspensionReason = *e.SuspensionReason
437437
}
@@ -451,7 +451,7 @@ func (r *CurrentAccountRepository) toDomain(e *CurrentAccountEntity) *domain.Cur
451451
```go
452452
// internal/adapters/events/current_account_publisher.go
453453

454-
// New method for BIAN 14.0 behavior qualifier
454+
// New method for BIAN 15.0 behavior qualifier
455455
func (p *CurrentAccountPublisher) PublishSuspended(
456456
ctx context.Context,
457457
account *domain.CurrentAccount,
@@ -478,28 +478,28 @@ pace.
478478
#### 1. Independent layer evolution
479479

480480
```text
481-
Domain: BIAN 14.0 (updated immediately)
481+
Domain: BIAN 15.0 (updated immediately)
482482
483-
Persistence: BIAN 13.0 schema + new nullable columns (gradual migration)
483+
Persistence: BIAN 14.0 schema + new nullable columns (gradual migration)
484484
485-
Events: New event type with BIAN 14.0 semantics (backward compatible)
485+
Events: New event type with BIAN 15.0 semantics (backward compatible)
486486
```
487487

488488
#### 2. Backward compatibility
489489

490-
Old consumers (BIAN 13.0) continue working:
490+
Old consumers (BIAN 14.0) continue working:
491491

492492
* Database: Nullable columns don't break existing queries
493493
* Events: New event type on new topic (old consumers unaffected)
494-
* Domain: New behavior qualifiers only used by v14 clients
494+
* Domain: New behavior qualifiers only used by v15 clients
495495

496496
#### 3. Gradual rollout
497497

498498
```text
499-
Week 1: Update CurrentAccount domain (BIAN 14.0)
499+
Week 1: Update CurrentAccount domain (BIAN 15.0)
500500
Week 2: Deploy database migration (add suspension columns)
501501
Week 3: Deploy new event type (account-suspended topic)
502-
Week 4+: Consuming services adopt BIAN 14.0 independently
502+
Week 4+: Consuming services adopt BIAN 15.0 independently
503503
```
504504

505505
**Without adapters:** Single BIAN upgrade would require coordinated deployment across all services, risking production

docs/adr/0012-lien-based-fund-reservation.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ to reserve funds without immediately debiting them.
4646
- **Overdraft prevention**: Must guarantee funds exist before initiating external payment
4747
- **Saga compensation**: Must be able to release funds if external payment fails
4848
- **Concurrent access**: Multiple payments from same account must work correctly
49-
- **BIAN alignment**: Follow BIAN v13 Current Account service domain patterns
49+
- **BIAN alignment**: Follow BIAN v14 Current Account service domain patterns
5050
- **Audit requirements**: Full traceability of fund reservations for regulatory compliance
5151
- **Performance**: Avoid blocking concurrent account operations during long-running sagas
5252

@@ -369,7 +369,7 @@ if err := paymentGateway.Submit(order); err != nil {
369369
## Links
370370

371371
- [ADR-0005: Adapter Pattern for Layer Translation](0005-adapter-pattern-layer-translation.md)
372-
- [BIAN v13 Current Account Service Domain](https://bian.org/semantic-apis/current-account/) - Defines the
372+
- [BIAN v14 Current Account Service Domain](https://bian.org/semantic-apis/current-account/) - Defines the
373373
CurrentAccountFacility control record and associated behavior qualifiers
374374
- [Saga Pattern (Microsoft)](https://docs.microsoft.com/en-us/azure/architecture/reference-architectures/saga/saga)
375375
- [GitHub Issue #7: Payment Order Service](https://github.com/meridianhub/meridian/issues/7)

docs/adr/0014-financial-instrument-reference-data.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ manages those instrument definitions.
2929

3030
### BIAN Service Domain
3131

32-
This ADR implements **BIAN Financial Instrument Reference Data Management** (v13.0.0):
32+
This ADR implements **BIAN Financial Instrument Reference Data Management** (v14.0.0):
3333

3434
> "This Service Domain maintains a directory of financial instrument reference data"
3535

docs/adr/0017-temporal-quality-ladder.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,9 +1143,9 @@ func (e PositionEntry) GetAttributes(ctx context.Context, repo MeasurementReposi
11431143

11441144
For settlement and reconciliation terms, see ADR-0018.
11451145

1146-
## BIAN v13 Alignment
1146+
## BIAN v14 Alignment
11471147

1148-
This ADR's concepts map to BIAN (Banking Industry Architecture Network) v13 service domains:
1148+
This ADR's concepts map to BIAN (Banking Industry Architecture Network) v14 service domains:
11491149

11501150
| Meridian Concept | BIAN Service Domain | BIAN Entity | Notes |
11511151
|-----------------|---------------------|-------------|-------|

docs/adr/0018-settlement-reconciliation.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -966,9 +966,9 @@ var (
966966
| **Variance** | Difference between settled quantity and current quantity for a position |
967967
| **Dispute** | Record created when new data arrives for a locked (finalized) position |
968968

969-
## BIAN v13 Alignment
969+
## BIAN v14 Alignment
970970

971-
This ADR's concepts map to BIAN (Banking Industry Architecture Network) v13 service domains:
971+
This ADR's concepts map to BIAN (Banking Industry Architecture Network) v14 service domains:
972972

973973
| Meridian Concept | BIAN Service Domain | BIAN Entity | Notes |
974974
|-----------------|---------------------|-------------|-------|

docs/adr/0025-clearing-purpose-specialization.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ Create separate tables: `deposit_clearing_accounts`, `withdrawal_clearing_accoun
169169
* [ADR-0024: Internal Account Service](0024-internal-account-service.md)
170170
* [Internal Account README](../../services/internal-account/README.md)
171171
* [Proto Definitions](../../api/proto/meridian/internal_account/v1/internal_account.proto)
172-
* [BIAN v13.0 Internal Account Service Domain](https://bian.org/semantic-apis/internal-account/)
172+
* [BIAN Internal Account Service Domain](https://bian.org/semantic-apis/internal-account/)
173173

174174
## Notes
175175

docs/architecture/api-contracts/current-account-contract.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,4 +860,4 @@ facility.CurrentBalance = mapBalancesToResponse(balances)
860860
- **ADR-0002**: Microservices Per BIAN Domain
861861
- **ADR-0005**: Adapter Pattern Layer Translation
862862
- **ADR-0023**: Balance Delegation to Position Keeping
863-
- **BIAN Reference**: Current Account Service Domain (Release 13.0)
863+
- **BIAN Reference**: Current Account Service Domain (Release 14.0)

0 commit comments

Comments
 (0)