← INDEX / PROJECTS ← ИНДЕКС / ПРОЕКТЫ

PRJ-004 · AUTOMATION

PRJ-004 · АВТОМАТИЗАЦИЯ

LP Reporting
Autopilot

Автопилот
отчётности для LP

Reporting packages that used to take a full 8-hour day of manual assembly now build themselves in minutes — with validation built into the pipeline, so a wrong number can't publish and getting faster never meant getting sloppier.

Отчётные пакеты, на ручную сборку которых уходил целый 8-часовой рабочий день, теперь собираются сами за минуты — с валидацией, встроенной в пайплайн, так что неверная цифра не может выйти в публикацию, а ускорение никогда не означало снижения качества.

Role
Роль
Design & build (lead)
Проектирование и разработка (ведущий)
Stack
Стек
Power Query · Power BI · Excel VBA
Scope
Охват
7 LP clients · 303 funds
7 LP-клиентов · 303 фонда
Status
Статус
In production · 6 quarters
В продакшене · 6 кварталов

// 01 — the problem

// 01 — проблема

Seven institutional clients. Daily, twice-weekly and weekly reporting packages. 303 underlying funds across the book. That is an assembly line — and humans are bad assembly lines. Every manual copy-paste between a GP statement and a client package is a chance to ship a wrong NAV to a limited partner.

The old process burned a full 8-hour day per package, and its only control was whoever assembled it noticing that a number "looked off". "Looks off" is not a control — it doesn't scale, it leaves no audit trail, and it fails silently at 4 p.m. on a Friday. At 17 packages a week, one slip in a few thousand hand-keyed cells eventually reaches a client.

The fix was never "assemble faster". It was to make assembly deterministic and put a gate in front of publication that a wrong number cannot pass. Speed was the by-product; the gate was the point.

Семь институциональных клиентов. Ежедневные, дважды в неделю и еженедельные отчётные пакеты. 303 базовых фонда по всему портфелю. Это конвейер — а люди плохие конвейеры. Каждое ручное копирование между отчётом GP и клиентским пакетом — это шанс отправить неверный NAV партнёру-вкладчику (LP).

Старый процесс сжигал целый 8-часовой день на пакет, и единственным контролем было то, что сборщик замечал, что цифра «выглядит не так». «Выглядит не так» — это не контроль — он не масштабируется, не оставляет аудиторского следа и молча даёт сбой в пятницу в 16:00. При 17 пакетах в неделю один промах среди нескольких тысяч вручную введённых ячеек рано или поздно дойдёт до клиента.

Решением никогда не было «собирать быстрее». Оно состояло в том, чтобы сделать сборку детерминированной и поставить перед публикацией шлюз, который неверная цифра не сможет пройти. Скорость была побочным продуктом; смысл был в шлюзе.

// 02 — the approach

// 02 — подход

$Map every package to its sources — GP statements, capital accounts, NAV feeds
$Power Query staging queries normalize every GP format into one canonical schema
$Incremental refresh pulls only new or restated periods — 303 funds stay cheap to re-run
$Validate — tie-outs, period continuity, cross-foot, variance, FX, missing-data — blocks bad data from publishing
$One refresh assembles the client package and its Power BI dashboards; VBA glues the export and file drop
$Exceptions route to an analyst queue — nothing publishes until the gate is green
$Сопоставить каждый пакет с его источниками — отчёты GP, счета капитала, потоки NAV
$Стейджинг-запросы Power Query нормализуют каждый формат GP в единую каноническую схему
$Инкрементальное обновление подтягивает только новые или пересчитанные периоды — 303 фонда дёшево перезапускать
$Валидация — сверки, непрерывность периодов, кросс-подсчёт, отклонения, FX, пропуски данных — блокирует плохие данные от публикации
$Одно обновление собирает клиентский пакет и его дашборды Power BI; VBA склеивает экспорт и выгрузку файлов
$Исключения направляются в очередь аналитика — ничего не публикуется, пока шлюз не станет зелёным

// 03 — the evidence

// 03 — доказательства

FIG 01 — MINUTES PER REPORTING PACKAGE РИС 01 — МИНУТ НА ОТЧЁТНЫЙ ПАКЕТ median assembly time across 12 release iterations медианное время сборки по 12 итерациям релиза

Every release cut the clock; the two plateaus are releases that added checks, not speed.

Каждый релиз сокращал время; два плато — это релизы, добавившие проверки, а не скорость.

FIG 06 — WHERE THE 8 HOURS WENT РИС 06 — КУДА УХОДИЛИ 8 ЧАСОВ per-package minutes by task — manual assembly vs autopilot минут на пакет по задачам — ручная сборка против автопилота

Manual work stacks to a full workday; the autopilot bar is the sliver at the bottom — that's the point.

Ручной труд складывается в целый рабочий день; столбец автопилота — тонкая полоска внизу, в этом и суть.

PULL & RE-KEY TIE-OUTS & CHECKS FORMAT & ASSEMBLE BUILD DASHBOARDS
ВЫГРУЗКА И ВВОД СВЕРКИ И ПРОВЕРКИ ФОРМАТ И СБОРКА ПОСТРОЕНИЕ ДАШБОРДОВ
FIG 02 — VALIDATION CATCHES PER QUARTER РИС 02 — СРАБАТЫВАНИЯ ВАЛИДАЦИИ ЗА КВАРТАЛ exceptions caught pre-publication, six quarters исключения, пойманные до публикации, шесть кварталов

Catches rose as rule coverage expanded, then fell as recurring GP issues got fixed at source.

Число срабатываний росло по мере расширения охвата правил, затем упало, когда повторяющиеся проблемы GP исправили у источника.

FIG 04 — WHAT THE GATE CAUGHT, BY CATEGORY РИС 04 — ЧТО ПОЙМАЛ ШЛЮЗ, ПО КАТЕГОРИЯМ 150 exceptions over six quarters, grouped by failing rule 150 исключений за шесть кварталов, сгруппированы по сработавшему правилу

Five of six categories hard-block the pipeline; only variance flags warn for human review.

Пять из шести категорий жёстко блокируют пайплайн; только флаги отклонений предупреждают для проверки человеком.

BLOCKS PIPELINE WARN → REVIEW
БЛОКИРУЕТ ПАЙПЛАЙН ПРЕДУПРЕЖДЕНИЕ → ПРОВЕРКА
FIG 03 — THE PIPELINE, END TO END РИС 03 — ПАЙПЛАЙН ОТ И ДО one refresh; a bad number cannot pass VALIDATE одно обновление; неверная цифра не пройдёт ПРОВЕРКУ
LIT = STAGE CLEARED AWAITING HANDOFF
ГОРИТ = ЭТАП ПРОЙДЕН ОЖИДАЕТ ПЕРЕДАЧИ
FIG 05 — ANALYST-HOURS RECLAIMED, CUMULATIVE РИС 05 — ВОЗВРАЩЁННЫЕ ЧАСЫ АНАЛИТИКОВ, НАКОПИТЕЛЬНО manual baseline minus autopilot, summed over six quarters ручная база минус автопилот, суммарно за шесть кварталов

The gate has given back roughly 7,200 analyst-hours — about 6,600 a year at run-rate.

Шлюз вернул примерно 7 200 часов аналитиков — около 6 600 в год при текущем темпе.

CUMULATIVE HOURS SAVED
НАКОПЛЕННЫЕ СЭКОНОМЛЕННЫЕ ЧАСЫ
FIG 07 — PACKAGES PROCESSED PER QUARTER РИС 07 — ПАКЕТОВ ОБРАБОТАНО ЗА КВАРТАЛ zero-touch package runs as clients came online запуски пакетов без ручного вмешательства по мере подключения клиентов

Throughput scales with clients onboarded, then flattens at ~221/quarter once all seven are live.

Пропускная способность растёт с подключением клиентов, затем выходит на плато ~221/квартал, когда все семеро активны.

PACKAGES / QUARTER
ПАКЕТОВ / КВАРТАЛ

// 04 — what moved

// 04 — что сдвинулось

0 min
Per package — from 480 (8h)
На пакет — со 480 (8 ч)
0+
Funds flowing through
Фондов проходит через систему
0
Errors reaching clients
Ошибок дошло до клиентов
0
Validation catches — 6 quarters
Срабатываний валидации — 6 кварталов
0+
Analyst-hours reclaimed
Часов аналитиков возвращено
0+
Packages / year, zero-touch
Пакетов / год, без ручного вмешательства

The team's day now starts with reviewing exceptions instead of assembling packages. Over six quarters the validation layer stopped 150 bad numbers before publication — and because VALIDATE blocks the pipeline rather than warning politely, zero reached a client. The same six quarters reclaimed roughly 7,200 analyst-hours; at the current run-rate the gate saves about 6,600 hours a year.

День команды теперь начинается с разбора исключений, а не со сборки пакетов. За шесть кварталов слой валидации остановил 150 неверных цифр до публикации — и поскольку ПРОВЕРКА блокирует пайплайн, а не вежливо предупреждает, ноль дошло до клиента. Те же шесть кварталов вернули примерно 7 200 часов аналитиков; при текущем темпе шлюз экономит около 6 600 часов в год.

// 05 — the gate

// 05 — шлюз

A warning is a suggestion; a block is a policy. Every hard rule in the catalog fails the refresh rather than annotating it, so a broken NAV tie-out can't be clicked past under deadline. The pipeline logs the rule ID, the fund, the two values that disagreed, and the analyst who cleared the exception — the audit trail that "looks off" never produced.

Exactly one rule warns instead of blocks: the variance / outlier flag. A 40% period-over-period move can be a real mark or a fat-fingered cell, and that judgment belongs to a person — so it routes to review rather than halting a clean package. Everything else is a hard gate.

Предупреждение — это рекомендация; блокировка — это политика. Каждое жёсткое правило в каталоге проваливает обновление, а не аннотирует его, так что несведённую сверку NAV нельзя «прокликать» под дедлайн. Пайплайн записывает ID правила, фонд, два несовпавших значения и аналитика, который снял исключение — тот аудиторский след, который «выглядит не так» никогда не давал.

Ровно одно правило предупреждает, а не блокирует: флаг отклонения / выброса. Движение на 40% от периода к периоду может быть реальной переоценкой или опечаткой в ячейке, и это суждение принадлежит человеку — поэтому оно направляется на проверку, а не останавливает чистый пакет. Всё остальное — жёсткий шлюз.

// 06 — paper · the full write-up

// 06 — статья · полное описание

LP Reporting Autopilot: A Validated, Zero-Touch Assembly Pipeline

Автопилот отчётности для LP: валидированный пайплайн сборки без ручного вмешательства

Abstract Аннотация

This note documents an automated pipeline that assembles limited-partner reporting packages for seven institutional clients across 303 underlying funds. Power Query staging queries normalize heterogeneous GP-statement formats into a single canonical schema; an incremental refresh feeds a validation engine whose rules block publication rather than merely warning; Power BI renders the dashboards and Excel VBA orchestrates export and delivery. Median assembly time fell from an 8-hour manual baseline to 11 minutes per package, reclaiming roughly 7,200 analyst-hours over six quarters. Across the same window the gate caught 150 exceptions before publication and zero errors reached a client. We document the architecture, the full validation rule catalog, a taxonomy of what the gate caught, throughput and per-client SLAs, the governance case for blocking over warning, and the limitations — format drift, key-person risk, and reconciliation edge cases — that bound the design.

Эта заметка описывает автоматизированный пайплайн, который собирает отчётные пакеты для партнёров-вкладчиков (LP) для семи институциональных клиентов по 303 базовым фондам. Стейджинг-запросы Power Query нормализуют разнородные форматы отчётов GP в единую каноническую схему; инкрементальное обновление питает движок валидации, правила которого блокируют публикацию, а не просто предупреждают; Power BI строит дашборды, а Excel VBA оркестрирует экспорт и доставку. Медианное время сборки упало с 8-часовой ручной базы до 11 минут на пакет, вернув примерно 7 200 часов аналитиков за шесть кварталов. За тот же период шлюз поймал 150 исключений до публикации, и ноль ошибок дошло до клиента. Мы описываем архитектуру, полный каталог правил валидации, таксономию того, что поймал шлюз, пропускную способность и SLA по клиентам, управленческое обоснование блокировки вместо предупреждения, а также ограничения — дрейф форматов, риск ключевого сотрудника и краевые случаи сверки — которые определяют границы дизайна.

1. Introduction

1. Введение

Reporting operations for a multi-client fund administrator is, at its core, a translation problem run at industrial cadence. Seven institutional limited partners — pensions, endowments, a sovereign, an insurer, foundations and a family office — each expect a reporting package on their own schedule and in their own house format, built from statements issued by the general partners of 303 underlying funds. Historically each package was hand-assembled: an analyst opened a stack of GP statements and capital-account summaries, keyed the figures into a client template, eyeballed the totals, and delivered. The only control was human attention, and its failure mode was silent. A transposed digit or a stale NAV would pass unless the assembler happened to notice it "looked off".

Отчётные операции для администратора фондов с несколькими клиентами — это по своей сути задача перевода, выполняемая в промышленном ритме. Семь институциональных партнёров-вкладчиков (LP) — пенсионные фонды, эндаументы, суверенный фонд, страховщик, благотворительные фонды и семейный офис — каждый ожидает отчётный пакет по своему графику и в своём фирменном формате, построенный из отчётов, выпущенных генеральными партнёрами (GP) 303 базовых фондов. Исторически каждый пакет собирался вручную: аналитик открывал стопку отчётов GP и сводок по счетам капитала, вбивал цифры в клиентский шаблон, на глаз проверял итоги и отправлял. Единственным контролем было человеческое внимание, и его сбой был бесшумным. Переставленная цифра или устаревший NAV прошли бы, если только сборщик случайно не замечал, что что-то «выглядит не так».

The reframing that drives this project is deliberate: the goal is not to assemble packages faster but to make assembly deterministic and to place a gate in front of publication that a wrong number cannot pass. Speed is a by-product of removing manual steps; the durable win is a publication control with an audit trail. The remainder of this note documents the source landscape, the architecture, the validation catalog, what the gate actually caught, throughput and scaling, the governance rationale, and the limitations that bound the design.

Переосмысление, которое движет этим проектом, намеренно: цель — не собирать пакеты быстрее, а сделать сборку детерминированной и поставить перед публикацией шлюз, который неверная цифра не сможет пройти. Скорость — побочный продукт устранения ручных шагов; долговременный выигрыш — это контроль публикации с аудиторским следом. Остальная часть заметки описывает ландшафт источников, архитектуру, каталог валидации, то, что шлюз реально поймал, пропускную способность и масштабирование, управленческое обоснование и ограничения, определяющие границы дизайна.

2. Source landscape & the normalization problem

2. Ландшафт источников и проблема нормализации

2.1 GP-statement heterogeneity
2.1 Разнородность отчётов GP

There is no standard for how a general partner presents a quarterly statement. Column order, sign conventions (distributions positive or negative), period labels ("Q2 2026" vs "6/30/26"), currency, and the very decomposition of a NAV roll-forward all vary from GP to GP. Capital-account statements and NAV feeds arrive as separate artifacts, often on different days, and the reporting-currency mapping is a house convention rather than anything printed on the statement. Any pipeline that consumes these sources must first collapse that variety into one shape before a single validation rule can be written.

Нет стандарта того, как генеральный партнёр представляет квартальный отчёт. Порядок столбцов, соглашения о знаках (распределения положительные или отрицательные), обозначения периодов («Q2 2026» против «6/30/26»), валюта и сама декомпозиция расчёта NAV — всё различается от GP к GP. Отчёты по счетам капитала и потоки NAV приходят отдельными артефактами, часто в разные дни, а сопоставление валюты отчётности — это внутреннее соглашение, а не что-то напечатанное в отчёте. Любой пайплайн, потребляющий эти источники, должен сначала свести всё это разнообразие к одной форме, прежде чем можно будет написать хотя бы одно правило валидации.

2.2 The canonical schema
2.2 Каноническая схема

The design pins everything to a single canonical table: one row per (client, fund, as-of period) with fixed, typed fields. Every downstream rule, dashboard and export reads this table and nothing else, so the heterogeneity is quarantined in the staging layer. Table 5 lists the abridged schema and the validation rule that guards each field.

Дизайн привязывает всё к единой канонической таблице: одна строка на (клиент, фонд, отчётный период) с фиксированными типизированными полями. Каждое последующее правило, дашборд и экспорт читают только эту таблицу и ничего больше, так что разнородность изолируется в слое подготовки. Таблица 5 приводит сокращённую схему и правило валидации, охраняющее каждое поле.

Table 5. The one schema every GP format normalizes into (abridged). Таблица 5. Единая схема, в которую нормализуется каждый формат GP (сокращённо).
FieldПолеTypeТипSourceИсточникValidated byВалидируется
client_idkeymappingV06
fund_idkeymappingV06
as_of_datedateGP statementV02, V06
reporting_ccyenummappingV05
begin_navnumprior packageV01
contributionsnumcapital accountV01, V03
distributionsnumcapital accountV01, V03
realized_pnlnumGP statementV01, V03
unrealized_pnlnumGP statementV01, V03
end_navnumGP statementV01
commitmentnumcapital accountV07
unfundednumcapital accountV07
2.3 Incremental refresh
2.3 Инкрементальное обновление

Re-staging 303 funds from scratch on every run would be wasteful and slow. Instead an incremental refresh re-stages only new or restated periods; a changed file hash triggers a targeted re-pull of just that GP's statement. The steady state — a quarter in which most funds are unchanged — therefore costs almost nothing to re-run, which is what makes a daily cadence economical across a book of this size.

Полная повторная подготовка 303 фондов с нуля на каждом запуске была бы расточительной и медленной. Вместо этого инкрементальное обновление заново готовит только новые или пересчитанные периоды; изменившийся хеш файла запускает точечную перезагрузку именно отчёта этого GP. Устойчивое состояние — квартал, в котором большинство фондов не изменилось — поэтому почти ничего не стоит перезапускать, что и делает ежедневный ритм экономичным для портфеля такого размера.

3. Architecture

3. Архитектура

3.1 Staging queries (Power Query)
3.1 Стейджинг-запросы (Power Query)

Each GP format has a dedicated staging query that maps its native layout onto the canonical schema — renaming columns, normalizing signs, parsing period labels and stamping the reporting currency. A union query appends all staged outputs into the single canonical table. Adding a new GP is a matter of writing one more staging query, not touching anything downstream.

Каждый формат GP имеет собственный стейджинг-запрос, который отображает его исходную структуру на каноническую схему — переименовывает столбцы, нормализует знаки, разбирает обозначения периодов и проставляет валюту отчётности. Объединяющий запрос присоединяет все подготовленные выходы в единую каноническую таблицу. Добавление нового GP — это написание ещё одного стейджинг-запроса, без изменения чего-либо ниже по потоку.

3.2 The validation engine
3.2 Движок валидации

The rules in Table 1 run over the staged canonical table before anything downstream can read it. Each rule emits an exception set; a single non-empty exception set on a BLOCK rule fails the refresh. There is no partial publication and no "publish anyway" affordance — the state machine has exactly two terminal states, green and red.

Правила из Таблицы 1 выполняются над подготовленной канонической таблицей до того, как что-либо ниже по потоку сможет её прочитать. Каждое правило выдаёт набор исключений; один непустой набор исключений по правилу BLOCK проваливает обновление. Нет ни частичной публикации, ни возможности «опубликовать всё равно» — у конечного автомата ровно два терминальных состояния: зелёное и красное.

3.3 Power BI layer
3.3 Слой Power BI

The dashboards bind to the validated canonical table, which means they can only ever render numbers that already cleared the gate. A figure a client sees on a dashboard and a figure in the delivered PDF pack are the same value from the same validated row, by construction.

Дашборды привязаны к валидированной канонической таблице, а значит, могут отображать только те цифры, что уже прошли шлюз. Значение, которое клиент видит на дашборде, и значение в доставленном PDF-пакете — это одна и та же величина из одной и той же валидированной строки, по построению.

3.4 VBA orchestration
3.4 Оркестрация на VBA

Excel VBA is the conductor: it kicks the refresh, checks the exception flag, and on green exports the workbook, renders the PDF pack and drops files into the client folder. On red it writes the exception log — rule ID, fund, the two disagreeing values — and stops without producing a deliverable. The orchestration is intentionally boring; its only job is to make the green path automatic and the red path loud.

Excel VBA — это дирижёр: он запускает обновление, проверяет флаг исключений и при зелёном экспортирует книгу, формирует PDF-пакет и выкладывает файлы в клиентскую папку. При красном он пишет журнал исключений — ID правила, фонд, два несовпавших значения — и останавливается, не создавая результат. Оркестрация намеренно скучна; её единственная задача — сделать зелёный путь автоматическим, а красный — громким.

4. The validation rule catalog

4. Каталог правил валидации

The catalog embodies a single philosophy: a hard rule blocks, it does not annotate. Six of the seven rules fail the refresh outright, because the conditions they test — a NAV that doesn't tie out, a missing period, a subtotal that doesn't foot, a currency mismatch, a null required field, an impossible commitment — are unambiguous defects with no legitimate reading. Only the variance rule (V04) warns, because a large period-over-period move can be a genuine mark. Table 1 gives the full catalog.

Каталог воплощает единую философию: жёсткое правило блокирует, а не аннотирует. Шесть из семи правил проваливают обновление напрямую, потому что условия, которые они проверяют — несведённый NAV, пропущенный период, не сходящийся подытог, несовпадение валюты, пустое обязательное поле, невозможное обязательство — это однозначные дефекты без легитимного толкования. Предупреждает только правило отклонений (V04), потому что крупное движение от периода к периоду может быть реальной переоценкой. Таблица 1 приводит полный каталог.

Table 1. Validation rule catalog. BLOCK fails the refresh; WARN routes to review. Таблица 1. Каталог правил валидации. BLOCK проваливает обновление; WARN направляет на проверку.
IDRuleПравилоWhat it catchesЧто оно ловитScopeОбластьBehaviorПоведение
V01NAV tie-outСверка NAVReported end-NAV ≠ capital-account roll-forward (begin NAV + contributions − distributions ± P&L), beyond $1 toleranceЗаявленный конечный NAV ≠ расчёт по счёту капитала (начальный NAV + взносы − распределения ± P&L), сверх допуска $1per fundпо фондуBLOCK
V02Period continuityНепрерывность периодовMissing, duplicated, or out-of-sequence reporting period vs the last accepted packageПропущенный, дублированный или нарушающий порядок отчётный период относительно последнего принятого пакетаper fundпо фондуBLOCK
V03Cross-foot totalsКросс-подсчёт итоговSub-totals don't sum to their stated total; fund rows don't roll up to the client totalПодытоги не складываются в заявленный итог; строки фондов не сходятся в итог клиентаper packageпо пакетуBLOCK
V04Variance / outlierОтклонение / выбросPeriod-over-period NAV or P&L move exceeds ±35% vs the fund's trailing historyДвижение NAV или P&L от периода к периоду превышает ±35% относительно предыдущей истории фондаper fundпо фондуWARN
V05FX consistencyСогласованность FXStatement currency ≠ mapped reporting currency, or an FX rate outside daily-feed toleranceВалюта отчёта ≠ сопоставленная валюта отчётности, или курс FX вне допуска дневного потокаper fundпо фондуBLOCK
V06Missing-data guardЗащита от пропусков данныхRequired field (NAV, commitment, unfunded, as-of date) null or unmapped after stagingОбязательное поле (NAV, обязательство, невыбранное, отчётная дата) пусто или не сопоставлено после подготовкиper fieldпо полюBLOCK
V07Commitment / unfundedОбязательство / невыбранноеUnfunded > commitment, or drawn + unfunded ≠ commitmentНевыбранное > обязательства, или выбранное + невыбранное ≠ обязательствуper fundпо фондуBLOCK

5. What the gate caught: an error taxonomy

5. Что поймал шлюз: таксономия ошибок

Over six quarters the gate caught 150 exceptions before publication. The shape of that 150 is informative: NAV and capital-account tie-outs (V01/V07) and period continuity (V02) dominate, together roughly half of all catches, which is exactly where a hand-keyed process would be expected to fail. Catches peaked in Q4’25 as rule coverage widened and the client base grew, then fell in 2026 as recurring GP-side issues were fixed upstream rather than caught downstream. Table 2 groups the catches by category; the figures reconcile with FIG 04 and with the per-quarter series in FIG 02 (13 + 21 + 28 + 34 + 27 + 27 = 150).

За шесть кварталов шлюз поймал 150 исключений до публикации. Структура этих 150 показательна: сверки NAV и счетов капитала (V01/V07) и непрерывность периодов (V02) доминируют, вместе примерно половина всех срабатываний — именно там, где ручной процесс и ожидаемо давал сбой. Число срабатываний достигло пика в Q4’25 по мере расширения охвата правил и роста клиентской базы, затем упало в 2026 году, когда повторяющиеся проблемы на стороне GP исправлялись у источника, а не ловились ниже по потоку. Таблица 2 группирует срабатывания по категориям; цифры сходятся с РИС 04 и с поквартальным рядом из РИС 02 (13 + 21 + 28 + 34 + 27 + 27 = 150).

Table 2. The 150 pre-publication catches, six quarters. Таблица 2. 150 срабатываний до публикации, шесть кварталов.
CategoryКатегорияCatchesСрабатываний% of 150RulesПравилаTypical root causeТипичная первопричинаBehaviorПоведение
NAV & cap-account tie-outsСверки NAV и счетов капитала4127.3%V01, V07GP restated a prior NAV / rounding in the roll-forwardGP пересчитал прежний NAV / округление в расчётеBLOCK
Period continuityНепрерывность периодов3322.0%V02GP re-sent a prior-period file or skipped a monthGP повторно прислал файл прошлого периода или пропустил месяцBLOCK
Cross-foot / total integrityКросс-подсчёт / целостность итогов2718.0%V03Subtotal excludes a sleeve, or a sign errorПодытог не включает сегмент, или ошибка знакаBLOCK
Variance / outlierОтклонение / выброс2416.0%V04Large legitimate mark vs a keying error — needs eyesКрупная легитимная переоценка против ошибки ввода — нужен человекWARN
FX consistencyСогласованность FX1510.0%V05GP reported in local currency vs a USD packGP отчитался в местной валюте при USD-пакетеBLOCK
Missing-data / mappingПропуски данных / сопоставление106.7%V06New fund not yet mapped, or a null as-of dateНовый фонд ещё не сопоставлен, или пустая отчётная датаBLOCK
TotalИтого150100%

6. Throughput & scaling

6. Пропускная способность и масштабирование

The seven clients run on three cadences — two daily, two twice-weekly and three weekly — for 17 packages a week, roughly 850 a year at the current run-rate. Table 3 gives the per-client cadence, package count, fund count and delivery SLA; the fund counts sum to 303 and the weekly package counts to 17. Table 4 is the throughput ledger: the same volume that consumed an estimated ~6,800 analyst-hours a year by hand now runs in about 156, a −97.7% reduction per package that scales linearly with volume because every incremental package is zero-touch.

Семь клиентов работают в трёх ритмах — два ежедневных, два дважды в неделю и три еженедельных — итого 17 пакетов в неделю, примерно 850 в год при текущем темпе. Таблица 3 приводит по каждому клиенту ритм, число пакетов, число фондов и SLA доставки; число фондов суммируется в 303, а недельное число пакетов — в 17. Таблица 4 — это учётная ведомость пропускной способности: тот же объём, который вручную потреблял по оценке ~6 800 часов аналитиков в год, теперь выполняется примерно за 156, снижение на −97,7% на пакет, которое масштабируется линейно с объёмом, потому что каждый дополнительный пакет обрабатывается без ручного вмешательства.

Table 3. Reporting cadence and delivery SLA by client (7 clients, 303 funds, 17 packages/week). Таблица 3. Ритм отчётности и SLA доставки по клиентам (7 клиентов, 303 фонда, 17 пакетов/неделю).
ClientКлиентCadenceРитмPackages/wkПакетов/недFundsФондовDelivery SLASLA доставкиPack typeТип пакета
Ashford PensionDailyЕжедневно56809:00 ET, next business day09:00 ET, след. рабочий деньNAV packПакет NAV
Beloit EndowmentDailyЕжедневно55408:00 ET, next business day08:00 ET, след. рабочий деньNAV packПакет NAV
Cedar SovereignTwice-weeklyДважды в неделю247Tue & Thu, 12:00 ETВт и Чт, 12:00 ETFull LP packПолный LP-пакет
Dunmore InsuranceTwice-weeklyДважды в неделю239Mon & Thu, 10:00 ETПн и Чт, 10:00 ETFull LP packПолный LP-пакет
Everett FoundationWeeklyЕженедельно131Fri, 15:00 ETПт, 15:00 ETFull LP packПолный LP-пакет
Fairhaven FoFWeeklyЕженедельно136Wed, 12:00 ETСр, 12:00 ETFull LP packПолный LP-пакет
Granby Family OfficeWeeklyЕженедельно128Mon, 09:00 ETПн, 09:00 ETSummary packСводный пакет
TotalИтого17303
Table 4. Per-package and annualized throughput ledger. Таблица 4. Ведомость пропускной способности на пакет и в годовом выражении.
MetricПоказательManual baselineРучная базаAutopilotАвтопилотDeltaДельта
Time per packageВремя на пакет480 min (8.0 h)480 мин (8,0 ч)11 min11 мин−97.7%
Packages / weekПакетов / неделю1717
Packages / year (run-rate)Пакетов / год (темп)~850~850
Analyst-hours / weekЧасов аналитиков / неделю~136~3.1−97.7%
Analyst-hours / yearЧасов аналитиков / год~6,800~156−6,644 reclaimed−6 644 возвращено
Validation catches (6 qtrs)Срабатываний валидации (6 кв.)0 (no gate)0 (без шлюза)150+150
Errors reaching clientОшибок дошло до клиентаuntrackedне отслеживалось0

7. Governance & audit trail

7. Управление и аудиторский след

The governance case for a block over a warning is straightforward once "looks off" is named for what it is: an undocumented, non-reproducible, deadline-sensitive human judgment. A block is the opposite on every axis. It is deterministic — the same inputs always produce the same verdict. It is non-bypassable — there is no "publish anyway" button to reach for at 4 p.m. on a Friday. And it leaves a stored record — every exception writes the rule ID, the fund, the two values that disagreed, and, once cleared, the analyst who cleared it. That record is the audit trail the manual process never produced.

Управленческое обоснование блокировки вместо предупреждения становится очевидным, как только «выглядит не так» называют своим именем: недокументированное, невоспроизводимое, зависящее от дедлайна человеческое суждение. Блокировка — противоположность по каждой оси. Она детерминирована — одни и те же входные данные всегда дают один вердикт. Она непреодолима — нет кнопки «опубликовать всё равно», к которой можно потянуться в пятницу в 16:00. И она оставляет сохранённую запись — каждое исключение фиксирует ID правила, фонд, два несовпавших значения и, после снятия, аналитика, который его снял. Эта запись — тот аудиторский след, который ручной процесс никогда не давал.

The one deliberate exception is V04. A 35–40% move can be a real mark or a keyed error, and no rule can tell them apart; forcing that call into a hard block would either halt clean packages or train analysts to loosen the threshold until it caught nothing. So variance warns and routes to a person, and the judgment stays human by design rather than by omission.

Единственное намеренное исключение — V04. Движение на 35–40% может быть реальной переоценкой или ошибкой ввода, и ни одно правило не отличит их; превращение этого решения в жёсткую блокировку либо остановило бы чистые пакеты, либо приучило бы аналитиков ослаблять порог, пока он не перестанет ловить хоть что-то. Поэтому отклонение предупреждает и направляется к человеку, и суждение остаётся человеческим по замыслу, а не по недосмотру.

8. Limitations & risks

8. Ограничения и риски

8.1 Format drift
8.1 Дрейф форматов

A GP that quietly changes its statement template breaks its staging query. The missing-data and mapping guards (V06) catch the break — the refresh fails rather than staging garbage — but recovery requires a human to patch the query. Drift is detected, not prevented; the design trades a silent-corruption risk for a visible-outage risk, which is the correct trade for a reporting gate.

GP, который тихо меняет шаблон своего отчёта, ломает его стейджинг-запрос. Защиты от пропусков данных и сопоставления (V06) ловят поломку — обновление проваливается, а не готовит мусор — но восстановление требует, чтобы человек залатал запрос. Дрейф обнаруживается, а не предотвращается; дизайн меняет риск тихой порчи данных на риск заметного простоя, что и есть правильный размен для отчётного шлюза.

8.2 Key-person risk
8.2 Риск ключевого сотрудника

The Power Query and VBA codebase currently has a single owner. That is the sharpest operational risk in the system: a bus-factor of one over the pipeline that seven clients depend on. The mitigants are documentation of each staging query and a designated second maintainer; neither is a substitute for genuinely shared ownership, which remains the top item on the roadmap.

У кодовой базы Power Query и VBA сейчас единственный владелец. Это самый острый операционный риск в системе: bus-фактор, равный единице, над пайплайном, от которого зависят семь клиентов. Смягчающие меры — документация каждого стейджинг-запроса и назначенный второй сопровождающий; ни то, ни другое не заменяет по-настоящему разделённой ответственности, которая остаётся главным пунктом дорожной карты.

8.3 Reconciliation edge cases
8.3 Краевые случаи сверки

Some legitimate events can pass a naive tie-out or trip a false one: restatements, side-pockets, in-kind distributions and mid-period transfers all bend the roll-forward. These are handled with tolerance bands and manual review rather than a hard rule, because encoding them as blocks would generate more false positives than genuine catches. The honest position is that the gate is strong on the common failure modes and deliberately soft on the rare structural ones.

Некоторые легитимные события могут пройти наивную сверку или ложно её сорвать: пересчёты, сайд-покеты, распределения в натуральной форме и переводы в середине периода — всё это искажает расчёт. Они обрабатываются полосами допуска и ручной проверкой, а не жёстким правилом, потому что кодирование их как блокировок дало бы больше ложных срабатываний, чем реальных. Честная позиция такова: шлюз силён на распространённых видах сбоев и намеренно мягок на редких структурных.

9. Conclusion

9. Заключение

The eleven-minute package is the headline, but it is the by-product. What the pipeline actually bought is determinism and a publication gate with an audit trail: 150 exceptions caught before they reached a client, zero errors delivered, roughly 7,200 analyst-hours reclaimed over six quarters and about 6,600 a year at run-rate, across 7 clients and 303 funds. Speed came for free once assembly stopped being a human act. The gate is what made getting faster safe.

Одиннадцатиминутный пакет — это заголовок, но он побочный продукт. То, что пайплайн реально принёс, — это детерминизм и шлюз публикации с аудиторским следом: 150 исключений, пойманных до того, как они дошли до клиента, ноль доставленных ошибок, примерно 7 200 возвращённых часов аналитиков за шесть кварталов и около 6 600 в год при текущем темпе, по 7 клиентам и 303 фондам. Скорость досталась бесплатно, как только сборка перестала быть человеческим действием. Именно шлюз сделал ускорение безопасным.

  1. Microsoft. Power Query M formula language & incremental refresh. Product documentation, 2025.
  2. Institutional Limited Partners Association (ILPA). Quarterly Reporting Standards, v2.1. 2024.
  3. AICPA. Audit Data Standards: fund NAV and capital-account roll-forward. 2023.
  4. Kimball, R. & Ross, M. The Data Warehouse Toolkit — staging and conformed dimensions. 3rd ed., Wiley, 2013.
  5. Satsevich, K. Validation-first reporting pipelines: internal design note. 2026.
  1. Microsoft. Язык формул Power Query M и инкрементальное обновление. Документация продукта, 2025.
  2. Institutional Limited Partners Association (ILPA). Стандарты квартальной отчётности, v2.1. 2024.
  3. AICPA. Стандарты аудиторских данных: NAV фонда и расчёт по счёту капитала. 2023.
  4. Kimball, R. & Ross, M. The Data Warehouse Toolkit — подготовка данных и согласованные измерения. 3-е изд., Wiley, 2013.
  5. Satsevich, K. Отчётные пайплайны с приоритетом валидации: внутренняя проектная заметка. 2026.
← PREV / PRJ-003← НАЗАД / PRJ-003Grid Exit PredictorПрогноз вывода энергоблоков