{% extends "base.html" %} {% from "_recon_table.html" import fmt %} {% block title %}Return templates — RWA Calculator{% endblock %} {% block container_mod %}container--wide{% endblock %} {# Per-state inline styling. app.css has `is-null` (dimmed) already; the others are new to this page and must still LOOK different, because a grid that renders "not emitted", "no population" and "cannot be computed" the same way has thrown the finding away. `is-unheld` is the pair table's fifth state -- "this side holds no leg for THIS exposure in this cell" -- which is none of the four above and must not be styled like any of them. #} {% set STATE_STYLE = { "is-figure": "", "is-null": "opacity:.55", "is-unavailable": "color:var(--oah-orange-bright);font-style:italic", "is-absent": "opacity:.3", "is-unheld": "color:var(--oah-slate-400);font-style:italic" } %} {% macro side(figure) -%} {{ figure.display }} {%- endmacro %} {% block content %}

← Back to the reconciliation report

Return templates · {{ page.framework }}

A return template is just another segment axis on this reconciliation: your extract is projected into our reporting ledger and run through the same generators as our own results, so both sides of a template come out of one engine. Pick a template and a sheet, then click a cell to see why it differs.

{% if page.warnings %}
{% for w in page.warnings %}
{{ w }}
{% endfor %}
{% endif %} {% if not page.available %}

No template comparison for this reconciliation.

{{ page.unavailable_reason }}

{% if page.remedies %}

What to map:

{% endif %}
{% else %}
{% if page.selected and page.selected.state == "unreachable" %}

Your mapping cannot produce this template at all.

{{ page.selected.blocked_reason }}

{% elif page.selected and page.selected.state == "unpopulated" %}

Nothing to fix here. {{ page.selected.population_note }}

{% endif %} {% if page.remedies %}

Your mapping cannot populate everything on this template. Those cells are shown as n/a, never as a legacy zero — a confident zero there would be the largest difference on the sheet, and its explanation would read as measurement: same loans, different number.

{% endif %}

How to read this page. A blank is never a zero, and the kinds of blank are not each other: emitted with no population (genuinely no money); · not emitted at all (the row or column is missing on that side); n/a cannot be computed from that side's sources; not held, in the exposure table under a cell, that side holds no leg for that one exposure here — the row and the column are both present. A reported 0 is a measured zero and looks different from all four.

{% if page.compare %}

{{ page.compare.template_label }}{% if page.compare.sheet %} · {{ page.compare.sheet }}{% endif %} · {{ page.compare.cell_count }} cells · {{ page.compare.material_count }} material · {{ page.compare.unmeasurable_count }} not measurable

{% for col in page.compare.columns %}{% endfor %} {% for row in page.compare.rows %} {% for cell in row.cells %} {% endfor %} {% endfor %}
Row Name{{ col.ref }}
{{ row.row_ref }} {{ row.row_name }} {{ side(cell.ours) }} / {{ side(cell.theirs) }}
{{ cell.delta_display }}

Worst cells — largest material differences first

{% if page.compare.worst %}

Material means the difference clears both floors set above ({{ "{:,.0f}".format(page.materiality.absolute) }} absolute and {{ page.materiality.percent }}% of the cell). {{ page.compare.material_count }} cell(s) qualify; the largest {{ page.compare.worst | length }} are shown.

{% for cell in page.compare.worst %} {% endfor %}
rownamecolcolumnourstheirsΔwhere
{{ cell.row_ref }} {{ cell.row_name }} {{ cell.col_ref }} {{ cell.col_name }} {{ side(cell.ours) }} {{ side(cell.theirs) }} {{ cell.delta_display }} {{ cell.status_label }}
{% else %}
No cell on this sheet clears the materiality floors.
{% endif %} {% if page.compare.unmeasurable %}

Not measurable — {{ page.compare.unmeasurable_count }} cell(s)

These cells have no difference at all, because one side cannot compute them. They are listed separately rather than ranked at the bottom of the list above: they have no number to sort on, and dropping them is how an unmapped carrier passes for a tie-out.

{% for cell in page.compare.unmeasurable %} {% endfor %}
rowcolcolumnourstheirswhat to do
{{ cell.row_ref }} {{ cell.col_ref }} {{ cell.col_name }} {{ side(cell.ours) }} {{ side(cell.theirs) }} {{ cell.note }}
{% endif %} {% else %}
Neither side emitted this sheet.
{% endif %} {% if page.explanation %} {% set ex = page.explanation %}

Cell {{ ex.row_ref }} / {{ ex.col_ref }} — {{ ex.col_name }}

{{ ex.row_name }} · cell kind {{ ex.kind }}{% if ex.metric %} · metric {{ ex.metric }}{% endif %}{% if ex.predicate_key %} · population {{ ex.predicate_key }}{% endif %}.

{{ ex.ours.display or ex.ours.title }}
ours
{{ ex.theirs.display or ex.theirs.title }}
theirs
{{ ex.delta_display }}
Δ

{{ ex.parent_note }}

{% if ex.refused %} {# Four refusals, four next actions. A coverage refusal is a MAPPING gap and not a difference at all; the other three are statements about the cell. #}
{% if ex.refusal_kind == "coverage" %}

Not mapped — this is not a difference.

{{ ex.refusal_headline }}

{% if ex.remedy %}

{{ ex.remedy }}

{% endif %}

Left unguarded, this cell would print a legacy 0 and the split below would attribute your whole figure to measurement — "same loans, different number". It is not that: their engine was never asked this question.

{% elif ex.refusal_kind == "non_additive" %}

No four-way split for this column — it is an average, not a total.

{{ ex.refusal_headline }}

{% elif ex.refusal_kind == "not_row_backed" %}

This cell has no exposure population.

{{ ex.refusal_headline }}

{% else %}

Not instrumented.

{{ ex.refusal_headline }}

{% endif %}

{{ ex.refusal }}

{% else %}

Why it differs

Click a cause to narrow the exposures below to it. exposures is that cause's whole population and of which differ only those whose own figures disagree: measurement holds every exposure both sides report, agreeing ones included, so the two columns are meant to diverge there. {% if ex.pairs.filtered %}Show every cause again.{% endif %}

{% for step in ex.steps %} {% endfor %}
causeamountexposuresof which differshare of explained
{{ step.label }} {{ step.display }} {{ "{:,}".format(step.keys) }} {{ "{:,}".format(step.drivers) }} {{ "{:.1%}".format(step.share) }}
reported Δ{{ ex.delta_display }}
{% if not ex.reconciles %}
The four causes do not add up to the reported difference — {{ ex.residual_display }} is unexplained. Read the split as incomplete: a post-execute pass can overwrite a cell after the population was aggregated.
{% endif %} {% endif %}

{{ ex.attribution }}

{% if ex.conservation %} {% set con = ex.conservation %}

The split above explains one cell, and is not a scope check. Whether this sheet holds the same money on both sides is a separate question, and it is the one that rules a moved row in or out: a move contributes to two cells of this sheet with opposite signs, so it cancels here and a leg that is simply not on the other side does not. For column {{ con.col_ref }} ({{ con.col_name }}) the sheet total is {{ con.display }}.

{{ con.note }}

{% endif %}

Exposures behind this cell

{# The note is rendered in BOTH branches and the description in only one: an empty table must still carry its reason, but a paragraph promising a ranking and a loan link is a description of a table that is not there. #} {% if ex.pairs.rows %}

One row per exposure — not per leg, and not two unrelated lists — with both sides on it, ranked by what each contributes. Ranking on size answers a different question: measured on a probe portfolio, two per-side listings ordered on RWEA and capped at 25 each rendered 50 rows of exact agreement while every driver of the difference sat below the cap. Showing {{ ex.pairs.term_label }}; a key opens the single-loan forensic and returns you to this cell.

{% endif %}

{{ ex.pairs.note }}

{% if ex.pairs.rows %}
{% for row in ex.pairs.rows %} {% endfor %}
exposurecauseourstheirsΔ
{% if row.identified %}{{ row.key_display }}{% else %}{{ row.key_display }}{% endif %} {{ row.term_label }} {{ side(row.ours) }} {{ side(row.theirs) }} {{ row.delta_display }}
{% endif %}

Open the per-key explorer for {{ page.sheet }} — the explorer filters on exposure class, not on a template cell, so this is the sheet's population and not only this cell's.

{% endif %} {% if page.matrix %} {% set m = page.matrix %}

Row migration — our row down, their row across

Population {{ m.predicate_key }}{% if m.columns %} (serves columns {{ m.columns | join(", ") }}){% endif %}, priced on {{ m.money_column }}. The diagonal is agreement; every off-diagonal cell is money that landed on a different row. Each leg appears in exactly one cell of this matrix. Click a cell to list the exposures behind it, with both rows named — those two names are the band boundary crossed.

Read this as value-driven. {{ m.attribution }}
{% if not m.axis_is_partition %}
Some legs reach no single provable leaf row on this axis — their rows are parents, or are indistinguishable from one another. Their money is kept in the {{ page.undecidable_row_ref }} bucket rather than dropped: an empty leaf filter is not a zero.
{% endif %}
{% for ref in m.their_rows %}{% endfor %} {% for row in m.cells %} {% for cell in row %} {% endfor %} {% endfor %}
ours ↓ theirs →{{ ref }}
{{ m.our_rows[loop.index0] }} {% if cell %}{{ cell.display }}{% else %}·{% endif %}
movement{{ m.money_column }}
same row on both sides{{ fmt(m.totals.agreed) }}
moved row (their value differs){{ fmt(m.totals.moved) }}
we split it, or filed it elsewhere on this template{{ fmt(m.totals.same_base_ours) }}
they filed it whole, or elsewhere on this template{{ fmt(m.totals.same_base_theirs) }}
mixed — our legs, some elsewhere on their template and some nowhere{{ fmt(m.totals.mixed_base_ours) }}
mixed — their legs, some elsewhere on our template and some nowhere{{ fmt(m.totals.mixed_base_theirs) }}
not on their template at all{{ fmt(m.totals.ours_only) }}
not on our template at all{{ fmt(m.totals.theirs_only) }}
held, no provable leaf row{{ fmt(m.totals.undecidable) }}

These nine classes partition the population: each leg is counted once, in one class. They are not a sum over template rows — rows on this axis overlap, so adding them up would double-count every leg reported under both a band and its parent.

The last three are the ones to read carefully. This matrix places legs, and we report one guaranteed loan as several — a guarantee leg under the guarantor's class and a remainder under the obligor's — where an extract holds it whole. Those legs have no counterpart at leg grain however completely the two books agree, so they used to be reported as "not on their template at all". The two split / filed elsewhere rows now carry them, which is what makes the two not on … at all rows a scope finding worth acting on.
{% if page.movers %} {% set mv = page.movers %}

Exposures behind {{ mv.our_row_ref }} → {{ mv.their_row_ref }}

Ours {{ mv.our_row_name }} ({{ mv.our_row_ref }}) against theirs {{ mv.their_row_name }} ({{ mv.their_row_ref }}), priced on {{ mv.money_column }}{% if mv.basis_label %} — {{ mv.basis_label }}{% endif %}. Those two names are the boundary crossed.

{{ mv.note }}

{% if mv.rows %}
{% for row in mv.rows %} {% endfor %}
legexposureourstheirson the other side
{{ row.key_display }}{% if row.split %} (one leg of several){% endif %} {% if row.identified %}{{ row.base_key }}{% else %}{{ row.key_display }}{% endif %} {{ side(row.ours) }} {{ side(row.theirs) }} {{ row.same_base_note }}
{% endif %}
Read this as value-driven. {{ mv.attribution }}
{% endif %} {% elif page.compare %}
This sheet has no membership groups, so no migration matrix can be drawn for it. That is "not instrumented", not "nothing moved".
{% endif %} {% endif %} {% endblock %}