# Traceability matrix · AS0572397

> Generated by `tools/generate_traceability_matrix.py` from the live registries of
> the nine services. Not a single row was written by hand. Regenerate with `make matrix`.

**44 of 44 rules** bound · **9 services** · oracle: 2675 of 2840 values equal, 165 intentional divergences, **0 defects**.

| Rule | Excel evidence | Context/Epic | Implementation | EP · Flow | Verification | Synthetic data | Status |
|---|---|---|---|---|---|---|---|
| **BR-001** Load the regulatory ledger as a pure source | AS0572397.xlsx · formula family · flow F1 step 2 | Source Acquisition and Reference Mapping (EPIC-01) | `source-svc · source_svc · load_regulatory_ledger` | EP004 · F1 | TC-BR-001-B1 TC-BR-001-B2 (Component) | DS-BR-001 / FIX-BR-001 | implemented / high |
| **BR-002** Load the general ledger extract | AS0572397.xlsx · formula family · flow F1 step 5 | Source Acquisition and Reference Mapping (EPIC-01) | `source-svc · source_svc · load_general_ledger` | EP004 · F1 | TC-BR-002-B1 TC-BR-002-B2 (Component) | DS-BR-002 / FIX-BR-002 | implemented / high |
| **BR-003** Maintain the regulatory classification list as reference data | AS0572397.xlsx · formula family · no flow step | Source Acquisition and Reference Mapping (EPIC-01) | `source-svc · source_svc · maintain_classification_register` | EP004 · F1 | TC-BR-003-B1 TC-BR-003-B2 (Component) | DS-BR-003 / FIX-BR-003 | implemented / high |
| **BR-004** Maintain the key-to-regulatory-code mapping table | AS0572397.xlsx · formula family · flow F1 step 3 | Source Acquisition and Reference Mapping (EPIC-01) | `source-svc · source_svc · maintain_mapping_table` | EP004 · F1 | TC-BR-004-B1 TC-BR-004-B2 (Component) | DS-BR-004 / FIX-BR-004 | implemented / high |
| **BR-005** Load the ancillary income sources | AS0572397.xlsx · formula family · no flow step | Source Acquisition and Reference Mapping (EPIC-01) | `source-svc · source_svc · load_ancillary_income` | EP004 · F1 | TC-BR-005-B1 TC-BR-005-B2 (Component) | DS-BR-005 / FIX-BR-005 | implemented / high |
| **BR-006** Build the composite key by concatenation | AS0572397.xlsx · formula family · no flow step | Key Construction and Regulatory Classification (EPIC-02) | `classification-svc · classification_svc · build_composite_key` | EP004 · F1 | TC-BR-006-B1 TC-BR-006-B2 (Component) | DS-BR-006 / FIX-BR-006 | implemented / high |
| **BR-007** Truncate the key segment to a fixed length | AS0572397.xlsx · formula family · no flow step | Key Construction and Regulatory Classification (EPIC-02) | `classification-svc · classification_svc · truncate_key_segment` | EP004 · F1 | TC-BR-007-B1 TC-BR-007-B2 (Component) | DS-BR-007 / FIX-BR-007 | implemented / high |
| **BR-008** Branch key construction on the attribute prefix | AS0572397.xlsx · formula family · no flow step | Key Construction and Regulatory Classification (EPIC-02) | `classification-svc · classification_svc · branch_key_by_prefix` | EP004 · F1 | TC-BR-008-B1 TC-BR-008-B2 (Component) | DS-BR-008 / FIX-BR-008 | implemented / high |
| **BR-009** Resolve the regulatory code in the mapping table | AS0572397.xlsx · formula family · no flow step | Key Construction and Regulatory Classification (EPIC-02) | `classification-svc · classification_svc · resolve_regulatory_code` | EP004 · F1 | TC-BR-009-B1 TC-BR-009-B2 (Component) | DS-BR-009 / FIX-BR-009 | implemented / high |
| **BR-010** Resolve account attributes in the regulatory ledger | AS0572397.xlsx · formula family · no flow step | Key Construction and Regulatory Classification (EPIC-02) | `classification-svc · classification_svc · resolve_account_attributes` | EP004 · F1 | TC-BR-010-B1 TC-BR-010-B2 (Component) | DS-BR-010 / FIX-BR-010 | implemented / high |
| **BR-011** Resolve the income statement line in the source sheet | AS0572397.xlsx · formula family · no flow step | Key Construction and Regulatory Classification (EPIC-02) | `classification-svc · classification_svc · resolve_income_statement_line` | EP004 · F1 | TC-BR-011-B1 TC-BR-011-B2 (Component) | DS-BR-011 / FIX-BR-011 | implemented / medium |
| **BR-012** Suppress the unmatched lookup | AS0572397.xlsx · formula family · no flow step | Key Construction and Regulatory Classification (EPIC-02) | `classification-svc · classification_svc · suppress_lookup_miss` | EP004 · F1 | TC-BR-012-B1 TC-BR-012-B2 (Component) | DS-BR-012 / FIX-BR-012 | implemented / high |
| **BR-013** Classify the entry as local or foreign currency | AS0572397.xlsx · formula family · no flow step | Currency Treatment (EPIC-03) | `currency-svc · currency_svc · classify_currency` | EP004 · F1 | TC-BR-013-B1 TC-BR-013-B2 (Component) | DS-BR-013 / FIX-BR-013 | implemented / high |
| **BR-014** Translate the foreign currency unit amount at the period rate | AS0572397.xlsx · formula family · flow F1 step 4 | Currency Treatment (EPIC-03) | `currency-svc · currency_svc · translate_fcbu_amount` | EP004 · F1 | TC-BR-014-B1 TC-BR-014-B2 (Component) | DS-BR-014 / FIX-BR-014 | implemented / high |
| **BR-015** Apply the period rate to the translated component | AS0572397.xlsx · formula family · flow F1 step 9 | Currency Treatment (EPIC-03) | `currency-svc · currency_svc · apply_rate_to_component` | EP004 · F1 | TC-BR-015-B1 TC-BR-015-B2 (Component) | DS-BR-015 / FIX-BR-015 | implemented / medium |
| **BR-016** Keep both translation bases side by side | AS0572397.xlsx · formula family · flow F1 step 4 | Currency Treatment (EPIC-03) | `currency-svc · currency_svc · keep_both_bases` | EP004 · F1 | TC-BR-016-B1 TC-BR-016-B2 (Component) | DS-BR-016 / FIX-BR-016 | implemented / medium |
| **BR-017** Build the phase 1 income statement | AS0572397.xlsx · formula family · flow F1 step 6 | Profit and Loss Consolidation (EPIC-04) | `statement-svc · statement_svc · build_phase1_income_statement` | EP004 · F1 | TC-BR-017-B1 TC-BR-017-B2 (Component) | DS-BR-017 / FIX-BR-017 | implemented / high |
| **BR-018** Consolidate profit and loss into the reporting view | AS0572397.xlsx · formula family · flow F1 step 8 | Profit and Loss Consolidation (EPIC-04) | `statement-svc · statement_svc · consolidate_reporting_view` | EP004 · F1 | TC-BR-018-B1 TC-BR-018-B2 (Component) | DS-BR-018 / FIX-BR-018 | implemented / high |
| **BR-019** Summarise profit and loss at the average rate | AS0572397.xlsx · formula family · flow F1 step 9 | Profit and Loss Consolidation (EPIC-04) | `statement-svc · statement_svc · summarise_at_average_rate` | EP004 · F1 | TC-BR-019-B1 TC-BR-019-B2 (Component) | DS-BR-019 / FIX-BR-019 | implemented / high |
| **BR-020** Add two components on the income statement line | AS0572397.xlsx · formula family · no flow step | Profit and Loss Consolidation (EPIC-04) | `statement-svc · statement_svc · sum_two_components` | EP004 · F1 | TC-BR-020-B1 TC-BR-020-B2 (Component) | DS-BR-020 / FIX-BR-020 | implemented / high |
| **BR-021** Build the asset schedule | AS0572397.xlsx · formula family · flow F1 step 10 | Balance Sheet Consolidation (EPIC-05) | `statement-svc · statement_svc · build_asset_schedule` | EP004 · F1 | TC-BR-021-B1 TC-BR-021-B2 (Component) | DS-BR-021 / FIX-BR-021 | implemented / high |
| **BR-022** Build the liability schedule | AS0572397.xlsx · formula family · flow F1 step 11 | Balance Sheet Consolidation (EPIC-05) | `statement-svc · statement_svc · build_liability_schedule` | EP004 · F1 | TC-BR-022-B1 TC-BR-022-B2 (Component) | DS-BR-022 / FIX-BR-022 | implemented / high |
| **BR-023** Build the off balance sheet schedule | AS0572397.xlsx · formula family · no flow step | Balance Sheet Consolidation (EPIC-05) | `statement-svc · statement_svc · build_off_balance_schedule` | EP004 · F1 | TC-BR-023-B1 TC-BR-023-B2 (Component) | DS-BR-023 / FIX-BR-023 | implemented / high |
| **BR-024** Carry the ledger balance onto the schedule line | AS0572397.xlsx · formula family · flow F1 step 10 | Balance Sheet Consolidation (EPIC-05) | `statement-svc · statement_svc · carry_ledger_balance` | EP004 · F1 | TC-BR-024-B1 TC-BR-024-B2 (Component) | DS-BR-024 / FIX-BR-024 | implemented / high |
| **BR-025** Restrict the intercompany counterparty to a closed list | AS0572397.xlsx · formula family · flow F4 step 1 | Intercompany Analysis (EPIC-06) | `intercompany-svc · intercompany_svc · restrict_counterparty` | EP002 · F4 | TC-BR-025-B1 TC-BR-025-B2 (Component) | DS-BR-025 / FIX-BR-025 | implemented / high |
| **BR-026** Compose the intercompany schedules by counterparty and account code | AS0572397.xlsx · formula family · no flow step | Intercompany Analysis (EPIC-06) | `intercompany-svc · intercompany_svc · compose_intercompany_schedules` | EP002 · F4 | TC-BR-026-B1 TC-BR-026-B2 (Component) | DS-BR-026 / FIX-BR-026 | implemented / high |
| **BR-027** Post the manual adjustment on the line | AS0572397.xlsx · formula family · flow F3 step 1 | Adjustment and Reconciliation (EPIC-07) | `controls-svc · controls_svc · record_manual_adjustment` | EP003 · F3 F7 | TC-BR-027-B1 TC-BR-027-B2 (Component) | DS-BR-027 / FIX-BR-027 | implemented / high |
| **BR-028** Apply the adjustment to the position schedule | AS0572397.xlsx · formula family · flow F3 step 2 | Adjustment and Reconciliation (EPIC-07) | `controls-svc · controls_svc · apply_adjustment_to_schedule` | EP003 · F3 F7 | TC-BR-028-B1 TC-BR-028-B2 (Component) | DS-BR-028 / FIX-BR-028 | implemented / medium |
| **BR-029** Feed the regulator confirmation back into the income adjustment | AS0572397.xlsx · formula family · flow F7 step 1 | Adjustment and Reconciliation (EPIC-07) | `controls-svc · controls_svc · feed_back_regulator_confirmation` | EP003 · F3 F7 | TC-BR-029-B1 TC-BR-029-B2 (Component) | DS-BR-029 / FIX-BR-029 | implemented / high |
| **BR-030** Prove the schedule by equality between two columns | AS0572397.xlsx · formula family · no flow step | Adjustment and Reconciliation (EPIC-07) | `controls-svc · controls_svc · prove_equality` | EP003 · F3 F7 | TC-BR-030-B1 TC-BR-030-B2 (Component) | DS-BR-030 / FIX-BR-030 | implemented / high |
| **BR-031** Compute the difference between two measures | AS0572397.xlsx · formula family · no flow step | Adjustment and Reconciliation (EPIC-07) | `controls-svc · controls_svc · measure_difference` | EP003 · F3 F7 | TC-BR-031-B1 TC-BR-031-B2 (Component) | DS-BR-031 / FIX-BR-031 | implemented / high |
| **BR-032** Compute the ratio with divide-by-zero protection | AS0572397.xlsx · formula family · no flow step | Adjustment and Reconciliation (EPIC-07) | `controls-svc · controls_svc · measure_ratio` | EP003 · F3 F7 | TC-BR-032-B1 TC-BR-032-B2 (Component) | DS-BR-032 / FIX-BR-032 | implemented / high |
| **BR-033** Reconcile the ledger against the counterpart system | AS0572397.xlsx · formula family · no flow step | Adjustment and Reconciliation (EPIC-07) | `controls-svc · controls_svc · reconcile_against_counterpart` | EP003 · F3 F7 | TC-BR-033-B1 TC-BR-033-B2 (Component) | DS-BR-033 / FIX-BR-033 | implemented / high |
| **BR-034** Aggregate by key with conditional sum | AS0572397.xlsx · formula family · no flow step | Adjustment and Reconciliation (EPIC-07) | `controls-svc · controls_svc · aggregate_by_key` | EP003 · F3 F7 | TC-BR-034-B1 TC-BR-034-B2 (Component) | DS-BR-034 / FIX-BR-034 | implemented / medium |
| **BR-035** Aggregate by parent-child hierarchy | AS0572397.xlsx · formula family · no flow step | Adjustment and Reconciliation (EPIC-07) | `controls-svc · controls_svc · aggregate_by_hierarchy` | EP003 · F3 F7 | TC-BR-035-B1 TC-BR-035-B2 (Component) | DS-BR-035 / FIX-BR-035 | implemented / medium |
| **BR-036** Populate the supervisory return from the statements | AS0572397.xlsx · formula family · flow F1 step 12 | Regulatory Return Preparation (EPIC-08) | `returns-svc · returns_svc · populate_supervisory_return` | EP004 · F1 | TC-BR-036-B1 TC-BR-036-B2 (Component) | DS-BR-036 / FIX-BR-036 | implemented / high |
| **BR-037** Populate the numbered sections of the return | AS0572397.xlsx · formula family · no flow step | Regulatory Return Preparation (EPIC-08) | `returns-svc · returns_svc · populate_sectional_return` | EP004 · F1 | TC-BR-037-B1 TC-BR-037-B2 (Component) | DS-BR-037 / FIX-BR-037 | implemented / high |
| **BR-038** Compose the statistical summary return | AS0572397.xlsx · formula family · no flow step | Regulatory Return Preparation (EPIC-08) | `returns-svc · returns_svc · compose_statistical_summary` | EP004 · F1 | TC-BR-038-B1 TC-BR-038-B2 (Component) | DS-BR-038 / FIX-BR-038 | implemented / high |
| **BR-039** Assemble the submission working set | AS0572397.xlsx · formula family · flow F6 step 1 | Submission Preparation and Validation (EPIC-09) | `submission-svc · submission_svc · assemble_submission` | EP004 · F1 F6 | TC-BR-039-B1 TC-BR-039-B2 (Component) | DS-BR-039 / FIX-BR-039 | implemented / high |
| **BR-040** Validate the set against the portal rules | AS0572397.xlsx · formula family · flow F1 step 13 | Submission Preparation and Validation (EPIC-09) | `submission-svc · submission_svc · validate_against_portal` | EP004 · F1 F6 | TC-BR-040-B1 TC-BR-040-B2 (Component) | DS-BR-040 / FIX-BR-040 | implemented / high |
| **BR-041** Record the EUC version | AS0572397.xlsx · formula family · no flow step | Documentation and Change Control (EPIC-10) | `governance-svc · governance_svc · record_euc_version` | EP004 · F1 | TC-BR-041-B1 TC-BR-041-B2 (Component) | DS-BR-041 / FIX-BR-041 | implemented / high |
| **BR-042** Record EUC controls and checkpoints | AS0572397.xlsx · formula family · no flow step | Documentation and Change Control (EPIC-10) | `governance-svc · governance_svc · record_controls_and_checkpoints` | EP004 · F1 | TC-BR-042-B1 TC-BR-042-B2 (Component) | DS-BR-042 / FIX-BR-042 | implemented / high |
| **BR-043** Load the defined-name register as broken | AS0572397.xlsx · formula family · no flow step | Documentation and Change Control (EPIC-10) | `governance-svc · governance_svc · record_broken_named_ranges` | EP004 · F1 | TC-BR-043-B1 TC-BR-043-B2 (Component) | DS-BR-043 / FIX-BR-043 | implemented / medium |
| **BR-044** Hide the working sheets from the reporting view | AS0572397.xlsx · formula family · no flow step | Presentation and Access Control (EPIC-11) | `governance-svc · governance_svc · hide_working_sheets` | EP004 · F1 | TC-BR-044-B1 TC-BR-044-B2 (Component) | DS-BR-044 / FIX-BR-044 | implemented / high |

## Logical elements per rule

| Rule | writes | element owner | crosses the boundary |
|---|---|---|---|
| BR-001 | LE011 | source-svc | — |
| BR-002 | LE023 | source-svc | — |
| BR-003 | LE024 | source-svc | — |
| BR-004 | LE027 | source-svc | LE027 |
| BR-005 | LE022 | source-svc | — |
| BR-006 | LE026 | classification-svc | — |
| BR-007 | LE026 | classification-svc | — |
| BR-008 | LE026 | classification-svc | — |
| BR-009 | LE027, LE029 | classification-svc | — |
| BR-010 | LE028, LE031 | classification-svc | — |
| BR-011 | LE043 | classification-svc | LE043 |
| BR-012 | LE085 | classification-svc | — |
| BR-013 | LE033 | currency-svc | — |
| BR-014 | LE041 | currency-svc | — |
| BR-015 | LE044 | currency-svc | LE044 |
| BR-016 | LE039, LE040, LE063 | currency-svc | LE063 |
| BR-017 | LE043, LE044 | statement-svc | — |
| BR-018 | LE048 | statement-svc | — |
| BR-019 | LE044 | statement-svc | — |
| BR-020 | LE043 | statement-svc | — |
| BR-021 | LE052 | statement-svc | — |
| BR-022 | LE052 | statement-svc | — |
| BR-023 | LE059 | statement-svc | — |
| BR-024 | LE053 | statement-svc | — |
| BR-025 | LE069 | intercompany-svc | — |
| BR-026 | LE071, LE072, LE073, LE074 | intercompany-svc | — |
| BR-027 | LE060 | controls-svc | — |
| BR-028 | LE052 | controls-svc | LE052 |
| BR-029 | LE060 | controls-svc | — |
| BR-030 | LE086 | controls-svc | LE086 |
| BR-031 | LE063, LE065 | controls-svc | — |
| BR-032 | LE087 | controls-svc | LE087 |
| BR-033 | LE064, LE068 | controls-svc | — |
| BR-034 | LE048 | controls-svc | LE048 |
| BR-035 | LE048 | controls-svc | LE048 |
| BR-036 | LE076 | returns-svc | — |
| BR-037 | LE078, LE079 | returns-svc | — |
| BR-038 | LE080 | returns-svc | — |
| BR-039 | LE081, LE082 | submission-svc | — |
| BR-040 | LE083 | submission-svc | — |
| BR-041 | LE004 | governance-svc | — |
| BR-042 | LE004 | governance-svc | — |
| BR-043 | LE004 | governance-svc | — |
| BR-044 | LE004 | governance-svc | — |

## Gap report

### What was NOT left out

- rules with no implementation: **0**
- logical elements with no owner: **0**
- flows with no handler: **0**
- test cases declared / referenced: 88 / 88
- datasets declared / referenced: 44 / 44

| flow | handler |
|---|---|
| F1 Regulatory reporting calculation chain | `POST /api/v1/periods/{period}/runs  (13 stages, SSE)` |
| F2 Set the reporting period | `POST /api/v1/periods` |
| F3 Post a manual adjustment | `POST /api/v1/periods/{period}/adjustments` |
| F4 Select the intercompany counterparty | `PUT  /api/v1/periods/{period}/intercompany/counterparty` |
| F5 Rejection of a value outside the validation list | `PUT  /api/v1/periods/{period}/intercompany/counterparty (D1 rejection)` |
| F6 Refresh the pivot views | `POST /api/v1/periods/{period}/aggregates/rebuild` |
| F7 Record the regulator confirmation | `POST /api/v1/periods/{period}/submission/regulator-confirmation` |

### Named gaps

**25 rules with no flow-step reference.** Not a defect: a workbook-structure rule and a pure-mapping rule belong to no step at all. They are: BR-003, BR-005, BR-006, BR-007, BR-008, BR-009, BR-010, BR-011, BR-012, BR-013, BR-020, BR-023, BR-026, BR-030, BR-031, BR-032, BR-033, BR-034, BR-035, BR-037, BR-038, BR-041, BR-042, BR-043, BR-044.

**48 logical elements no rule writes.** These are the ingested and the reference ones — they arrive from outside the calculation cycle: LE001, LE002, LE003, LE005, LE006, LE007, LE008, LE009, LE010, LE012, LE013, LE014, LE015, LE016, LE017, LE018, LE019, LE020, LE021, LE025, LE030, LE032, LE034, LE035, LE036, LE037, LE038, LE042, LE045, LE046, LE047, LE049, LE050, LE051, LE054, LE055, LE056, LE057, LE058, LE061, LE062, LE066, LE067, LE070, LE075, LE077, LE084, LE088.

**9 rules write into an element owned by another service.** A fact of the graph — the spreadsheet has no boundary. The write leaves by event and the element's owner stays the only writer:

| rule | rule's service | element | owner |
|---|---|---|---|
| BR-004 | source | LE027 Regulatory Classification Reference | classification |
| BR-011 | classification | LE043 Income Statement Line Balance | statement |
| BR-015 | currency | LE044 Income Statement Amount At Average Rate | statement |
| BR-016 | currency | LE063 Rate Difference | controls |
| BR-028 | controls | LE052 Balance Sheet Line Balance | statement |
| BR-030 | controls | LE086 Statement Equality Proof | statement |
| BR-032 | controls | LE087 Measure Ratio | statement |
| BR-034 | controls | LE048 Aggregated Transaction Amount | statement |
| BR-035 | controls | LE048 Aggregated Transaction Amount | statement |

**7 medium-confidence bindings**, each carrying a note: BR-011, BR-015, BR-016, BR-028, BR-034, BR-035, BR-043.

**12 `column_ordinal` collisions in Asset 2.** `physical_location.column_ordinal` is relative to the data region, not to the sheet, and `physical_location` does not carry the region offset. On a single-region sheet starting at column 0 it works; on a multi-region sheet several elements collide on the same ordinal:

| sheet · ordinal | elements |
|---|---|
| ALF PL!ord1 | LE030 parent_Child, LE057 Category, LE043 Sum_of_Balance, LE081 Row_Labels |
| FX rate table!ord2 | LE035 Month_end_Rate, LE034 FCBU |
| ODM-P&L!ord1 | LE030 parent_Child, LE056 Sum_of_LCYAct |
| Off BS recon!ord1 | LE009 BSPtype, LE081 Row_Labels, LE057 Category |
| Phase2 Assets_S18!ord1 | LE054 HUB, LE052 Balance, LE055 Primary, LE062 Adjustment_Alf, LE051 Particular, LE053 Balace_as_per_SS616__Hub_Number_ |
| Phase2 Liabilities_S18!ord1 | LE052 Balance, LE051 Particular |
| Pl Summary at AVG rate!ord1 | LE030 parent_Child, LE056 Sum_of_LCYAct, LE081 Row_Labels |
| SS616!ord10 | LE031 ALBSP_Final, LE040 LCY_in_LKR_at_Avg_rate |
| SS616!ord11 | LE030 parent_Child, LE063 Diff |
| SS616!ord9 | LE012 LCYAvg, LE039 LCY_in_LKR_at_Closing_rate |
| web submission workings!ord1 | LE014 BSP, LE041 FCBU___LKR, LE048 Sum_of_Amount, LE029 GRCA_mapping, LE081 Row_Labels, LE049 HSBC_Total, LE046 Gain, LE047 Loss, LE060 Manual_adj |
| web submission workings!ord2 | LE015 Group, LE034 FCBU |

## Behaviour deliberately excluded from the target

| excluded | reason |
|---|---|
| Sending to the FinNet portal | EPIC-09 declares `FileIO / Outbound`: the workbook produces the file, a human delivers it |
| BIAN mapping | all 7 flows declare `NO_BIAN_MAPPING_FOUND` with confidence 0 |
| Named ranges | 2,794 of 3,126 are `#REF!`; the remaining 332 are Lotus residue |
| The 52-sheet layout | the target replaces spreadsheet interaction with a controlled API/UI |
| Execution audit trail | no evidence: `governance` here is the EUC version register |
| Zero for unknown | the workbook does it (`No GRCA` -> `0.0`); the target produces `not_applicable` |

