☰ Contents
AISA v2.0 / Technical documentation / Measurements — 02.09.2026

Measurements — 02.09.2026

F verified factP decided planC open challenge

Everything the platform's design cites as a measured fact was taken on 02.09.2026, in five passes over five different sources, plus a sixth pass — § CE, the case census — taken on 07.09.2026. This page holds all six. Each section states its own source, its method and its date, so a figure can be re-taken rather than trusted; where a later pass superseded an earlier one, the earlier one says so and stays.

§ What was measured Source Cited by
TM the Jira ticket archive — 485 tickets: what is asked, how often each shape recurs, what share ends in a database write jira_tickets/, scripts/mine_tickets_extract.py + mine_tickets_classify.py Data and Information Module § 0.2 (the ticket catalogue and the holder counts, moved there by D145), Value and ROI § 1
TT AISA v1's own hours per ticket against the human estimate the analysis carries the same archive, scripts/mine_tickets_timing.py Value and ROI § 2b
TB v1 retrieval — whether grep over the flat memory index finds the precedent a resolved ticket actually cited memory/MEMORY.md + KNOWN_ISSUES.md, scripts/triage_baseline.py Platform Details PG-13, Support Components, Agents Memory § 7.2
DB the customer estate — pricing-factor shape, UI_REQUIRED, PL/SQL change cadence, SRD_SUPPORT prerequisites, restore capability, the absent DML log Bulstrad QA, STAGING and PROD over the SQLcl MCP, SELECT only Stage IPAL, Stage Planning, Failure and Recovery, Software Architecture
RE the source estate — factor consumers, the truncation cap, endpoint registration, the CI recipe, message ordering, the library delta, fix signatures, retrieval mechanics, the renderer, the twelve configuration parts, intentgpt, loop-back serdica-backend five branches, serdica-infrastructure, the workspace; read-only, path@branch:line Configuration Module, Stage IPAL, Stage Serdica, Agent Runtime
CE the case census of 07.09.2026 — 345 analysed tickets by the shape the desk actually worked and how each ended; 300 + 134 customer-line commits by shape, seam, lineage and ticket; the configuration changes on STAGING's SRD_IPROD, SRD_ANLT and ABC_ACCESS by table group and product jira_tickets/ analyses read one by one; git log/show/ls-tree over origin/* refs; STAGING and PROD over the SQLcl MCP, SELECT only the three typical-cases pages: Data and information, Development, Configuration

Section ids are stable. A reference is written § DB-1a, § RE-5, § TT-2 — the prefix names the pass, so inserting a measurement never renumbers an existing one. The CH ids that appear in the DB and RE sections are the register ids of 02.09.2026 and do not resolve against today's Challenges Register.


TM. The ticket archive — 485 Jira tickets

Measured 02.09.2026 over C:\dev\aisa-poc\jira_tickets\485 unique tickets (514 directories → 485 keys after merging duplicates; 2 empty directories dropped). Scripts: scripts/mine_tickets_extract.py (→ tickets.csv, tickets_full.json) and scripts/mine_tickets_classify.py.

The per-ticket table that used to close this pass was raw archive data cited by nothing; it is regenerable from the two scripts above and has been removed. The HDesk and e-mail counts of § TM-8 were superseded the same day by a full read of the two archives — Challenge Rounds § R2-1 — which reclassified them.

TM-0 Method

  1. Newest Jira JSON snapshot per ticket dir (412 tickets); 73 older dirs have only the analysis HTML, whose header table supplied key/summary/status/created/priority (reporter mostly missing there). Duplicate dirs for one key merged (newest snapshot wins; any HTML wins).
  2. Request type = ordered keyword rules (BG+EN) over summary + description, tuned after reading headings/internal notes of 40 analysis HTMLs spread across the range; contract class / severity / L-level regexed from the HTML classification block (322 of 332 HTMLs have one).
  3. Skill candidates counted as union of a request-side regex (summary+description) and an analysis-side regex (technical tokens in the HTML); effort class inferred from analysis size + comment count (see caveats).

TM-1 Request-type distribution

Request type Count % Median resolution days (resolutiondate) n resolved Pending w/o resolutiondate Still open
incident/defect 81 17% 2 35 20 24
question/how-to 17 4% 4.0 4 9 4
data correction 157 32% 1 65 45 38
transfer/sync failure IPAL<->INSIS 107 22% 1.5 28 40 31
access/account 40 8% 1 11 18 6
master data 22 5% 11.0 12 3 6
configuration change 32 7% 9 13 9 8
report/extract 3 1% 3.5 2 1 0
CR candidate/new feature 22 5% 9.0 4 3 15
other 4 1% 6 1 0 3
all 485 100% 2 175 148 135

Resolution days are available only for tickets carrying a Jira resolutiondate (Completed/Closed/Canceled/Done). Most fixed tickets are parked in Pending (customer's turn) without a resolutiondate, and the JSON snapshots were taken at investigation time (usually the creation day), so no reliable time-to-fix exists for them; the two right-hand columns give the counts instead.

TM-1a Request type per year-month

Month total incident question data-fix transfer access master config report CR other
(unknown) 5 1 0 2 1 1 0 0 0 0 0
2025-02 1 0 0 1 0 0 0 0 0 0 0
2025-03 6 3 0 1 1 0 1 0 0 0 0
2025-04 3 0 0 0 2 0 0 1 0 0 0
2025-05 5 1 0 2 2 0 0 0 0 0 0
2025-06 8 2 2 3 0 0 1 0 0 0 0
2025-07 14 3 0 5 1 0 1 3 1 0 0
2025-08 8 2 0 4 0 0 0 2 0 0 0
2025-09 5 0 0 1 2 0 1 1 0 0 0
2025-10 3 0 0 1 1 0 1 0 0 0 0
2025-11 2 2 0 0 0 0 0 0 0 0 0
2025-12 2 1 0 0 0 1 0 0 0 0 0
2026-01 11 3 0 3 1 0 2 2 0 0 0
2026-02 13 1 0 5 3 1 2 1 0 0 0
2026-03 31 3 0 9 3 1 1 4 1 9 0
2026-04 63 3 0 21 13 10 2 9 0 4 1
2026-05 74 9 1 28 18 9 1 5 0 3 0
2026-06 76 12 2 27 19 7 3 1 0 5 0
2026-07 89 19 8 24 20 7 4 3 1 1 2
2026-08 64 16 4 18 20 3 2 0 0 0 1
2026-09 2 0 0 2 0 0 0 0 0 0 0

TM-2 Monthly volume (created)

Month Tickets Completed/Closed Pending Open/Under review/investig. Next Release Canceled
(unknown) 5 2 1 0 0 0
2025-02 1 1 0 0 0 0
2025-03 6 6 0 0 0 0
2025-04 3 3 0 0 0 0
2025-05 5 5 0 0 0 0
2025-06 8 7 0 0 0 1
2025-07 14 12 0 1 1 0
2025-08 8 8 0 0 0 0
2025-09 5 5 0 0 0 0
2025-10 3 2 0 0 0 1
2025-11 2 1 0 1 0 0
2025-12 2 2 0 0 0 0
2026-01 11 9 0 1 1 0
2026-02 13 12 1 0 0 0
2026-03 31 15 0 13 3 0
2026-04 63 29 18 15 1 0
2026-05 74 20 33 17 2 2
2026-06 76 20 33 23 0 0
2026-07 89 25 34 28 1 1
2026-08 64 11 28 23 2 0
2026-09 2 0 0 2 0 0

The archive is not the full SD project: it holds the tickets AISA worked on. 2025 rows are sparse (mostly re-opened/related cases); coverage is dense from 2026-03 on.

TM-3 Status distribution (newest snapshot; HTML-only tickets show status at analysis time)

Status Count
Completed 186
Pending 148
Under review 71
Open 50
Next Release 11
Closed 8
Canceled 5
Under investigation 3
(unknown) 1
Done 1
RESOLVED — IPAL UPDATE приложен 2026-04-17 10:17, IPAL↔INSIS в синхрон 1

TM-4 Contract classification found in analysis HTMLs

Of 332 tickets with an analysis HTML: contract section {'(none)': 17, '§1': 296, '§2': 19}; severity {'(none)': 119, 'Sev 2': 16, 'Sev 3': 151, 'Sev 4': 43, 'Sev 1': 3}; personalization level {'P3': 9, 'P2': 13}; support level {'(none)': 15, 'L1': 113, 'L2': 204}.

TM-5 Skill candidates (sorted by count)

Count = tickets whose summary/description match the request-side regex (what the customer asked for) — the conservative figure. Analysis mentions = tickets whose analysis HTML contains the technical tokens of that operation (how the fix was done); it exceeds Count when the operation is a means rather than the request (e.g. retransfer after a data fix). Effort class = modal inferred class over the request-side set, with distribution T/R/I/M = trivial / routine / investigation / multi-day. Example keys = lowest-numbered request-side matches (analysis-side for the two analysis-only rows).

# Skill candidate Count Analysis mentions Effort (modal; T/R/I/M) Example keys Skill: inputs → actions → verification
1 Jira conversation (BG customer reply, internal note, Pending transition) 330 330 investigation 1-3 h; 40/116/137/37 SD-879, SD-1208, SD-1353, SD-1442, SD-1443, SD-1445, SD-1446, SD-1447 inputs: analysis result → draft BG public reply + technical internal note + tag AISA → transition Under Review → Pending; verify comment ids
2 retransfer / return-to-application / stuck transfer 112 160 routine ~30 min; 21/47/35/9 SD-39, SD-152, SD-174, SD-179, SD-181, SD-254, SD-289, SD-400 inputs: policy/offer no → read C_POLICIES/POL_ANNEXES state, TRANSFERRED_ITEMS, MIGR_LOG, SR_USER_NOTES, INSIS POLICY; classify failure (blocked validation / mapping / dup / zombie tx); emit fix SQL or "return-to-application + retransfer" steps → verify PAS_POLICY_ID + INSIS state
3 print a document / print-template fix (BI Publisher, CFG_PRINT_DOCS) 50 87 routine ~30 min; 6/17/17/10 SD-108, SD-113, SD-488, SD-526, SD-593, SD-641, SD-1208, SD-1258 inputs: policy no + doc type → resolve template + params from DB, evaluate print gates, call BI Publisher over VPN → PDF saved; for template bugs: diff gate/limit rows (e.g. GEN_RISK_LIMITS) and emit fix SQL
4 Kibana log trace by request id / policy 45 45 investigation 1-3 h; 0/8/23/14 SD-1544, SD-1558, SD-1562, SD-1592, SD-1599, SD-1641, SD-1675, SD-1702 inputs: policy no / time window / user → Kibana query for backend + transfer logs → extract error chain → attach to analysis
5 discount / loading / deductible fix on a policy (отстъпка, завишение, самоучастие) 40 77 routine ~30 min; 11/14/11/4 SD-400, SD-619, SD-864, SD-1083, SD-1135, SD-1309, SD-1372, SD-1384 inputs: policy + desired premium components → POL_PREM_RATE/POL_COVER_DEF vs INSIS GEN_RISK_COVERED/PREM_INST → UPDATE or annex → premium reconciles to target
6 user account create / deactivate / roles (ИП employee, broker user) 38 62 investigation 1-3 h; 3/11/21/3 SD-193, SD-697, SD-966, SD-1297, SD-1452, SD-1480, SD-1531, SD-1549 inputs: email/ЕГН/agent code → INSIS P_PEOPLE/LDAP_USERS vs IPAL C_CUST/C_CONTACTS/USER_ACCOUNTS/IC_USERS/roles → INSERT/UPDATE set (Pattern A/B) → verify login layer + account tree
7 policy IPAL<->INSIS sync compare + fix (per-policy) 32 31 routine ~30 min; 3/14/11/4 SD-152, SD-174, SD-179, SD-412, SD-503, SD-1237, SD-1409, SD-1516 inputs: policy no → run compare checklist §0 (state, annexes, covers, PREM_INST vs POL_PPLAN, participants, objects) → ordered UPDATE/INSERT SQL → post-fix diff = 0
8 ИП agent / broker / office setup (add-agent) 31 38 investigation 1-3 h; 0/11/16/4 SD-193, SD-787, SD-1536, SD-1549, SD-1562, SD-1576, SD-1590, SD-1603 inputs: agent/office no → INSIS P_OFFICES/P_PEOPLE → IPAL IC_BRANCHES/C_CUST/USER_ACCOUNTS/CFG_POLICY_NO_SEQ counters → gap list + SQL → account tree render + test issuance
9 ownership / lessee / beneficiary (bank) annex problems 31 25 routine ~30 min; 4/11/11/5 SD-39, SD-129, SD-181, SD-254, SD-289, SD-335, SD-1179, SD-1353 inputs: policy + party → INSIS O_OBJECT_OWNERS/O_OBJECT_CREDITED vs IPAL participants → identify missing propagation → INSERT/UPDATE or re-issue annex → participant tables match
10 installment plan / due-date change (1→4 вноски, падежи) 30 75 routine ~30 min; 4/14/12/0 SD-345, SD-479, SD-966, SD-1524, SD-1526, SD-1532, SD-1602, SD-1619 inputs: policy no + target plan → read POL_PPLAN + INSIS PREM_INST/PREM_INST_FRACT → call SRD_INTEGR.CHANGE_INSTALLMENTS / UPDATE dates both sides → verify sums = FULL_PREMIUM, no paid inst touched
11 MYR multi-year policy repair (periods /2 /3, print, stale pointers) 25 39 routine ~30 min; 2/10/10/3 SD-1525, SD-1542, SD-1552, SD-1554, SD-1556, SD-1598, SD-1602, SD-1638 inputs: MYR family root → C_POLICIES family, C_CAR.MYR_POLICY@insis, INSIS per-period POLICY rows, BI template gate → repair pointers / re-run period transfer → print periods 1..N verified
12 getRates / ABACUS pricing check 21 62 routine ~30 min; 6/7/6/2 SD-1144, SD-1257, SD-1443, SD-1452, SD-1498, SD-1562, SD-1576, SD-1611 inputs: offer/policy or factor set → replay ABACUS rating (ABC_ACCESS logs / PPA design) vs IPAL POL_PREM_RATE → pinpoint factor/rule → explain or config fix
13 validation threshold relax / revert (CFG_FLD_VALIDATION / ABC CFG) 18 41 routine ~30 min; 0/10/7/1 SD-193, SD-547, SD-550, SD-631, SD-1208, SD-1257, SD-1571, SD-1577 inputs: product + rule/field + new bound + policy → locate CFG row (IPAL or ABC_ACCESS) → two-step OFF/relax → operator transfer → revert; verify row back to baseline
14 duplicate-policy / ЕИСОУКР (ГФ) status & data-fetch check 17 81 investigation 1-3 h; 3/5/6/3 SD-152, SD-174, SD-254, SD-289, SD-383, SD-844, SD-879, SD-1100 inputs: reg no / VIN / policy → EISOUKR log rows, response code catalogue, duplicate check across INSIS active MTPL → explain code / identify blocking policy → next action
15 policy cancel / terminate that did not propagate (анулиране/прекратяване) 16 74 routine ~30 min; 4/5/4/3 SD-311, SD-687, SD-732, SD-1089, SD-1100, SD-1103, SD-1317, SD-1562 inputs: policy no → annex CANCEL_POLICY status, TRANSFERRED_ITEMS, INSIS state, EISOUKR log → retransfer or manual INSIS cancel → verify both PAS closed, ГФ notified
16 VIN / reg-no / vehicle-type correction on issued policy (рама, кемпер) 16 16 routine ~30 min; 2/7/6/1 SD-129, SD-335, SD-1405, SD-1445, SD-1700, SD-1718, SD-1724, SD-1737 inputs: policy + correct VIN/regno → OBJ_CAR vs O_CAR diff (case-sensitive), annex history → REGNO/CHVIN annex or direct UPDATE both sides → COMPARE_IPAL_INSIS_CAR = 0 diffs
17 commission / self-retention (комисион, самозадържане) correction 16 45 trivial <15 min; 7/5/3/1 SD-193, SD-571, SD-756, SD-1427, SD-1452, SD-1489, SD-1511, SD-1542 inputs: policy/agent + target % → participant commission rows IPAL vs INSIS (per period for MYR) → UPDATE → recomputed commission amounts verified
18 framework 1101 extension (удължаване на договор) 14 13 trivial <15 min; 7/5/1/1 SD-654, SD-1516, SD-1594, SD-1634, SD-1715, SD-1832, SD-1834, SD-1835 inputs: framework no + new end date → UPDATE INSIS POLICY/GEN_RISK_COVERED/INSURED_OBJECT + IPAL C_POLICIES/POL_ANNEXES/POL_COVERS/POL_PREM_RATE/POL_OBJECTS/REPORT_POLICIES_PC → verify all date layers equal
19 Beth (AI assistant) failures 14 24 routine ~30 min; 2/8/3/1 SD-129, SD-335, SD-571, SD-1121, SD-1273, SD-1405, SD-1489, SD-1745 inputs: user + timestamp + policy → Beth service logs (Kibana), backend call trace → classify (outage / validation / data) → reply or escalate
20 framework 1101 sync so a child 1102/1103 can issue (sync-framework) 13 9 routine ~30 min; 1/6/5/1 SD-1237, SD-1561, SD-1564, SD-1605, SD-1617, SD-1650, SD-1712, SD-1748 inputs: 1101 no → policy/annex state, PAS_POLICY_ID mapping, participants, cargo object + AVERAGE_AGENT, covers + rate triad, loadings → ordered fix SQL → child 1102 test issuance
21 1103 monthly statement (сведение) correction after claim lock 13 21 routine ~30 min; 3/4/4/2 SD-756, SD-1515, SD-1530, SD-1666, SD-1705, SD-1706, SD-1731, SD-1772 inputs: statement no + desired values (превози, max/превоз, ЗС, premium) → IPAL POL_OBJECT_VALUES/POL_PREM_RATE/POL_PREM + INSIS INSURED_OBJECT/GEN_RISK_COVERED/PREM_INST → dual-side UPDATE (Bulstrad-IT for INSIS) → verify totals
22 policy restore after mistaken cancel (възстановяване) 12 25 routine ~30 min; 3/6/3/0 SD-152, SD-311, SD-1220, SD-1317, SD-1434, SD-1660, SD-1689, SD-1756 inputs: policy no → check cancel annex + INSIS state + payments/claims → reverse annex / re-transfer → verify ACTIVE both sides, premium unchanged
23 cargo text-field correction (застрахован товар, описание на стока/обект) 12 5 routine ~30 min; 4/6/2/0 SD-1502, SD-1635, SD-1639, SD-1646, SD-1716, SD-1839, SD-1848, SD-1852 inputs: policy + new text → POL_OBJECT_VALUES text rows + INSIS INSURED_OBJECT/ADDITIONAL_TEXT → UPDATE both → reprint shows text
24 office / issuer code on debit note or policy (код на офис/издател 100) 12 11 routine ~30 min; 1/6/3/2 SD-108, SD-113, SD-469, SD-697, SD-1098, SD-1576, SD-1628, SD-1787 inputs: policy → participants/office rows IPAL vs INSIS, user session office, print journal → UPDATE office/issuer → debit note reprint correct
25 translations / labels / message texts (SR_MESSAGES, labels) 12 27 routine ~30 min; 2/4/4/2 SD-80, SD-439, SD-755, SD-844, SD-1452, SD-1788, SD-1838, SD-1857 inputs: screen/product + old→new text (BG/EN) → locate key (SR_MESSAGES/labels/DESCR_LINK) → UPDATE per language → UI/print shows new text
26 pricing factor / LOV value add (авариен комисар, dropdown values) 11 42 routine ~30 min; 1/8/2/0 SD-529, SD-1161, SD-1188, SD-1250, SD-1325, SD-1593, SD-1709, SD-1814 inputs: product(s) + factor + new value (+dependency key e.g. TO_PLACE) → INSIS source row → INSERT PR_PRICING_FACTOR_VALUES/_DEPENDENT (per product) → LOV visible in UI
27 policyholder / insured swap or nationality fix (застраховащ/застрахован) 10 26 investigation 1-3 h; 2/3/4/1 SD-174, SD-617, SD-1595, SD-1622, SD-1656, SD-1727, SD-1749, SD-1766 inputs: policy + correct parties → POLCLM_PARTICIPANTS + INSIS POLICY.CLIENT_ID/INSURED_PARTY → UPDATE both → print shows correct names
28 currency / FX-rate correction (превалутиране, курс USD) 9 19 routine ~30 min; 1/6/2/0 SD-1266, SD-1417, SD-1621, SD-1643, SD-1738, SD-1750, SD-1822, SD-1852 inputs: policy + rate date → POL_PREM/PREM_INST currency + rate rows → UPDATE rate/amounts consistently → premium totals reconcile in both PAS
29 policy number / sequence configuration (CFG_POLICY_NO_SEQ) 6 14 routine ~30 min; 1/2/2/1 SD-1485, SD-1553, SD-1579, SD-1711, SD-1823, SD-1941 inputs: product + office/year + env → CFG_POLICY_NO_SEQ rows + sequence existence (INSIS) → INSERT row / CREATE SEQUENCE request → test issuance number generated
30 product role grant / revoke for many users (роля по продукт, UR_*) 6 47 investigation 1-3 h; 0/2/3/1 SD-1619, SD-1627, SD-1830, SD-1952, SD-1954, SD-1988 inputs: role + target set (all employees / one user) → current grants → bulk INSERT/DELETE IC_USER_ROLES → count check + UI visibility
31 BSO blank ranges add (Green Cards + Stickers, add-bso) 5 32 routine ~30 min; 0/3/2/0 SD-1591, SD-1722, SD-1773, SD-1789, SD-1944 inputs: ranges (GC + sticker) → format/Cyrillic-Latin validation, overlap check vs existing → INSERT SQL → count + range verify
32 report / extract SQL for the customer (справка) 5 investigation 1-3 h; 2/0/3/0 SD-612, SD-1372, SD-1727, SD-1942, SD-1996 inputs: criteria (agent, product, period, access) → parametrised SELECT over C_POLICIES/participants/INSIS → CSV/XLSX attached to Jira
33 person / company policies lookup (person-policies) 5 0 trivial <15 min; 2/1/2/0 SD-879, SD-1524, SD-1757, SD-1989, SD-1990 inputs: ЕГН/ЕИК/name → INSIS policyholder + object participant + creditor, IPAL-only applications → table of policies + duplicate-customer detection
34 vehicle make/model add (add-car) 2 2 trivial <15 min; 1/0/1/0 SD-1258, SD-1740 inputs: make+model(+product) → three-nomenclature lookup IPAL/INSIS/EISOUKR → L1/L2 matrix → INSERT SQL (dual-row rule) → visible in pricing LOV + transfer test
35 blank / Green Card / sticker issue on a policy (серия Г, invalid blank) 2 3 investigation 1-3 h; 0/0/2/0 SD-1042, SD-1678 inputs: policy no → blank rows in IPAL/INSIS, validity dates, cover/premium linkage → fix or explain → print/EISOUKR reflects blank
36 Camunda / process registration 1 34 investigation 1-3 h; 0/0/1/0 SD-1993 inputs: product/operation → check process definitions / instances → register missing process or terminate stuck instance → operation completes

Seed items with fewer than 5 matches are still listed so the absence is visible. "Jira conversation" and "Kibana trace" are analysis-side only (they describe how a ticket is worked, not what was asked). Existing workspace skills already cover: add-car, add-bso, add-agent, print-policy, check-transfer, sync-framework, person-policies, analyze-policy, classify-ticket, investigate-ticket, jira-access, configure-product.

TM-6 Top reporters (only 4 distinct reporter accounts exist in the archive; the shared ServiceDesk account files OTRS-transferred tickets)

Reporter Tickets incident data-fix transfer access config CR other types
Liliya Andreeva 214 49 83 42 11 10 1 18
Tonika Yotova 138 19 40 41 14 8 1 15
(missing — HTML-only dirs) 69 4 23 11 10 9 9 3
Lyubomir Andreev 49 8 10 11 5 4 1 10
ServiceDesk 15 1 1 2 0 1 10 0

TM-7 DB-write share (proxy for data-correction load)

TM-8 HDesk (OTRS) cache and e-mail threads — titles only, superseded

Superseded by Challenge Rounds § R2-1, which read every hdesk/*/metadata.json and every THREADS.md heading instead of titles and reached different numbers: 39 of the 52 HDesk tickets are Configuration-module intake (not 20+4), and the OTRS support stream is 30 of the 38 mail threads. The title-level pass is kept because it is what the counts on this page were computed against.

TM-9 Caveats (what the heuristics miss)


TT. Agent time against the human estimate

Measured 02.09.2026 13:56 over C:\dev\aisa-poc\jira_tickets (485 ticket keys, 512 directories). Script: scripts/mine_tickets_timing.py, data: ticket_timing.csv.

Read with D54: the flat 25 % rule below was later adjusted — agent time down 25 %, the person's time up 25 % — until a stopwatch measurement replaces both, and times vary by domain and by person. Hours are the unit; no figure here is money (D52, D79).

TT-0 Method

Per ticket key (dirs SD-<n> and SD-<n>_<slug> merged; git history keyed by jira_tickets/SD-<n> path so renames are followed):

TT-1 Source availability

Source tickets share
any snapshot JSON (a) 412 85%
≥1 git commit (b) 483 100%
≥2 git commits 302 62%
files present (c) 483 100%
analysis HTML with AISA timeline rows (d) 182 38%
… with time-bearing stamps 124 26%
agent_elapsed computable 483 100%
financial card present 299 62%
financial table parsed (human_est_h) 230 47%
both agent_time and human_est 230 47%

Elapsed source used: firstcommit_after-snapshot=301, timeline-snapshot=111, lastcommit-firstcommit=71, none=2. Financial card source: table=230, none=186, placeholder=48, text-only=18, table-unparsed=3. Financial check (hours vs amount/rate): ok=194, na=33, mismatch:3/3=2, mismatch:3/5=1. Timeline stamp cells: 330 rows, 181 with time, 108 date-only, 41 unparsed (, "re-analyze", etc).

TT-1a mtime reliability

mtime_min collapses onto a few dates: 2026-07-17 (147), 2026-05-19 (55), 2026-08-28 (41) — top-3 dates cover 50% of 483 dirs. These are checkout/merge dates, not work dates → mtimes are not used in any estimator.

TT-1b Commit batching

n_commits per ticket: 0: 2, 1: 181, 2: 81, 3: 116, 4: 72, 5+: 33. Most common first-commit dates: 2026-08-28 (47), 2026-08-03 (43), 2026-07-24 (36), 2026-04-10 (32), 2026-08-21 (26) — the first ones are bulk imports of pre-existing analyses, so first_commit is not a start time for them.

TT-2 Distributions (hours)

agent_time_h — why the all-tickets figures are not the measurement

Over all 483 tickets with a computable elapsed, agent_time_h has an ALL median of 76.9 h and a mean of 1 497 h. Those are commit-batching artefacts: 301 of the 483 take their elapsed from a commit, and many analyses were committed in bulk days or weeks after the work. The subsets below are the measurement; elapsed_reliable is the filter.

agent_time_h — RELIABLE subset (timeline-based, or commit ≤ 24 h after snapshot)

request_type n median p25 p75 mean
ALL 185 2.03 1.03 4.55 7.13
data correction 61 1.79 1.03 3.27 3.88
transfer/sync failure IPAL<->INSIS 45 1.71 0.75 3.94 4.62
incident/defect 33 2.57 1.58 4.55 15.75
access/account 21 1.85 1.02 3.27 7.09
configuration change 7 2.44 1.94 12.5 7.98
master data 7 3.87 0.58 6.19 5.13
CR candidate/new feature 7 14.51 2.27 18.16 12.76
question/how-to 4 6.83 3.35 9.59 6.11

agent_time_h — only tickets whose elapsed came from AISA timeline − snapshot

request_type n median p25 p75 mean
ALL 111 1.49 0.85 2.58 7.0
data correction 43 1.46 0.93 2.58 2.47
transfer/sync failure IPAL<->INSIS 23 0.96 0.63 1.73 4.03
incident/defect 20 1.92 1.03 3.14 21.24
access/account 14 1.62 1.08 2.22 6.28
configuration change 4 1.98 1.32 2.59 1.94
master data 5 0.65 0.51 3.87 4.71
CR candidate/new feature 1 32.98 32.98 32.98 32.98
question/how-to 1 1.18 1.18 1.18 1.18

timeline_span_h — the span between the first and last AISA stamp

Over the 43 tickets carrying two or more time-bearing stamps: median 0.95 h, p25 0.31, p75 1.77 (the mean, 11.3 h, is one 43-hour incident row). This is the agent's own working span within a ticket and is the comparator Challenge Rounds § R2-10 names for the switch-cost measurement — never elapsed.

lastcommit_minus_snapshot_h — not used

The naive "last commit − snapshot" estimator gives an ALL median of 836.8 h over 412 tickets, because bulk retrofits and finalize_analysis re-runs later touched every directory. It measures the archive's edit history, not agent time, and no figure on this page or in Value and ROI is derived from it.

active_h is 0 for 325 of 485 tickets (single commit + snapshot more than 4.0 h apart → no measurable window).

active_h (clustered work windows) — tickets with active_h > 0

request_type n median p25 p75 mean
ALL 158 1.62 0.82 2.76 1.88
data correction 58 1.62 0.91 2.43 1.82
transfer/sync failure IPAL<->INSIS 41 1.16 0.71 2.76 1.75
incident/defect 25 1.71 0.8 2.45 1.99
access/account 17 1.87 1.4 2.81 2.09
configuration change 6 2.15 1.48 2.62 1.94
master data 5 1.26 0.4 3.62 1.88
CR candidate/new feature 4 2.02 1.02 3.02 2.01
question/how-to 2 2.38 1.65 3.1 2.38

human_est_h (analysis author's own estimate)

request_type n median p25 p75 mean
ALL 230 2.0 1.0 4.88 4.33
data correction 71 2.0 1.0 5.8 4.91
transfer/sync failure IPAL<->INSIS 58 2.0 0.83 3.5 3.43
incident/defect 40 3.55 2.0 6.12 5.38
access/account 26 0.9 0.5 2.0 1.41
configuration change 16 1.75 0.75 3.25 3.37
master data 9 1.0 0.5 1.75 1.51
CR candidate/new feature 2 9.0 8.5 9.5 9.0
question/how-to 5 3.5 1.5 4.0 16.5
other 2 13.5 9.25 17.75 13.5
report/extract 1 0.75 0.75 0.75 0.75

human_true_h (= 0.25 × human_est_h)

request_type n median p25 p75 mean
ALL 230 0.5 0.25 1.22 1.08
data correction 71 0.5 0.25 1.45 1.23
transfer/sync failure IPAL<->INSIS 58 0.5 0.21 0.88 0.86
incident/defect 40 0.89 0.5 1.53 1.34
access/account 26 0.23 0.12 0.5 0.35
configuration change 16 0.44 0.19 0.81 0.84
master data 9 0.25 0.12 0.44 0.38
CR candidate/new feature 2 2.25 2.12 2.38 2.25
question/how-to 5 0.88 0.38 1.0 4.13
other 2 3.38 2.31 4.44 3.38
report/extract 1 0.19 0.19 0.19 0.19

Ratio human_true_h / agent_time_h (tickets with both)

request_type n median ratio p25 p75 median human_true median agent_time
ALL (any source) 230 0.09 0.01 0.39 0.5 4.49
ALL (reliable elapsed only) 150 0.24 0.09 0.65 0.5 1.89
data correction (reliable) 51 0.28 0.12 0.8 0.56 1.94
transfer/sync failure IPAL<->INSIS (reliable) 36 0.29 0.09 0.73 0.32 1.62
incident/defect (reliable) 28 0.4 0.23 0.74 0.75 2.0
access/account (reliable) 19 0.09 0.06 0.27 0.2 1.85
master data (reliable) 7 0.13 0.07 0.14 0.25 3.87
configuration change (reliable) 6 0.29 0.08 0.73 0.56 2.4
CR candidate/new feature (reliable) 2 0.08 0.08 0.09 2.25 27.24
question/how-to (reliable) 1 0.32 0.32 0.32 0.38 1.18

Also the ratio of medians (median human_true / median agent_time) is shown implicitly by the last two columns; the median of per-ticket ratios is the more robust figure.

TT-3 Ten example tickets (all columns)

key request_type snapshot_ts first_commit last_commit n_commits mtime_min mtime_max aisa_timeline_first aisa_timeline_last agent_elapsed_h active_h agent_time_h human_est_h human_true_h
SD-1578 access/account 2026-04-22T11:04:40 2026-04-23T09:29:38 2026-07-17T18:56:09 5 2026-05-19T12:45:31 2026-07-17T19:09:56 22.42 0.0 22.67 6.0 1.5
SD-1669 configuration chang 2026-05-12T14:49:58 2026-05-13T12:31:33 2026-07-17T18:56:09 3 2026-05-19T12:45:32 2026-07-17T19:09:57 2026-05-12T00:00:00 2026-05-12T00:00:00 21.69 0.0 21.94 1.2 0.3
SD-1697 data correction 2026-05-19T17:20:25 2026-05-20T10:36:56 2026-07-17T18:56:09 3 2026-05-20T11:33:46 2026-07-17T19:09:57 2026-05-19T17:35:00 2026-05-19T18:19:00 0.98 0.98 1.23 1.5 0.38
SD-1731 data correction 2026-06-01T13:43:36 2026-06-02T11:43:22 2026-07-17T18:56:09 3 2026-06-02T12:54:48 2026-07-17T19:09:57 2026-06-01T15:34:00 2026-06-01T15:34:00 1.84 1.84 2.09 1.5 0.38
SD-1756 data correction 2026-06-08T16:25:30 2026-06-10T10:25:05 2026-07-17T18:56:09 3 2026-07-17T19:09:57 2026-07-17T19:09:57 2026-06-08T17:12:00 2026-06-08T17:12:00 0.78 0.78 1.03 0.5 0.12
SD-1789 master data 2026-06-19T14:41:40 2026-06-19T18:37:05 2026-07-17T18:56:09 3 2026-06-24T15:42:29 2026-07-17T19:09:57 2026-06-19T14:53:00 2026-06-19T14:53:00 0.19 3.92 0.44 0.25 0.06
SD-1837 access/account 2026-06-25T09:55:49 2026-06-25T11:20:01 2026-07-17T18:56:09 4 2026-07-17T19:09:57 2026-07-17T19:09:57 2026-06-25T10:30:00 2026-06-25T11:10:00 1.24 1.4 1.49 1.5 0.38
SD-1933 data correction 2026-07-13T17:46:43 2026-07-14T16:50:49 2026-07-17T18:56:09 2 2026-07-17T19:09:57 2026-07-17T19:09:57 23.07 0.0 23.32 2.5 0.62
SD-1989 master data 2026-07-28T16:45:43 2026-08-03T10:37:08 2026-08-03T10:37:08 1 2026-07-28T16:47:16 2026-07-29T11:10:27 2026-07-28T16:57:00 2026-07-29T10:35:00 17.82 0.19 18.07 6.0 1.5
SD-2068 incident/defect 2026-08-06T08:55:56 2026-08-06T15:18:26 2026-08-28T15:27:12 3 2026-08-06T10:27:05 2026-08-28T14:30:02 2026-08-06T10:20:00 2026-08-06T11:45:00 2.82 6.38 3.07 3.6 0.9

TT-4 Financial-table parsing — the day-rate examples are removed (D79)

The five raw parse examples that closed this section quoted the analyses' own role × hours × day-rate tables in full, with the sums in currency and two revenue-impact figures. Money is not a metric of this platform (D52, D79) — no figure on any page is expressed in currency — so the examples are gone. What they demonstrated is already measured above: the parser's own cross-check of hours against amount ÷ rate passed on 194 of 230 parsed cards, failed on 3 and was not applicable on 33. Only the hours column of those tables is used; human_est_h is the sum of it.

TT-5 Caveats


TB. Triage baseline — v1 retrieval on held-out tickets

The number the memory tree has to beat. Measured 02.09.2026 by scripts/triage_baseline.py: grep over v1's flat memory — the 563 MEMORY.md one-line descriptions plus the 56 KNOWN_ISSUES.md headings, 619 index lines in all — asked to find the reference article or known issue that a resolved ticket's own analysis actually cited. Truth = the articles and KIs named in that ticket's analysis HTML. Three figures come out of it: hit-rate 10 %, false-precedent rate 98 %, 7 of 30 tickets return nothing.

This is a baseline, not a verdict on the articles: 548 v1 files exist and are individually good; what fails is retrieval over one-line descriptions. The measurement is the acceptance test of the migration — re-run the same script on the same held-out set against the tree.

TB-0 Protocol

TB-1 The numbers, and the thirty tickets

hit-rate (truth in top 5) : 3/30 = 10% top-1 correct : 1/30 = 3% false-precedent rate (noise slots): 147/150 possible slots (30 x 5) = 98% tickets with empty result : 7/30

Key Bucket Status Hit Top1 #truth Top-5 returned Truth (first 4) matched words (top-2)
SD-2011 access Completed n n 7 reference/bulk_document_extraction_windows.md
reference/hlt_serdika_excel_testfile_editing.md
reference/office_docs_read_and_render.md
reference/local_msg_extraction.md
KI-022
KI-023
reference/annex_transfer.md
reference/bulstrad_office_individual_agent_activation.md
com; com
SD-1944 bso Completed n n 1 reference/assistance_card_numbers.md
feedback/jira_adf_date_node_invisible_in_list.md
project/aisa_next_review_2026_09_02.md
project/bst_health_second_handover_drop_2026_08_09.md
docs/archive/unknown_rules_sd1000-1564_candidates.md
reference/bso_format.md карта; 2026
SD-1999 transfer Under review* n n 2 reference/ipal_customer_sync_flow.md
reference/ipal_insis_id_mapping_tables.md
SD-1998 framework Under review* n n 2 reference/cargo_1101_family_sync.md
reference/cargo_framework_extension_workflow.md
SD-1981 cargo_corr Pending* n n 3 reference/cargo_1102_premium_change_retransfer.md
reference/policy_sync_compare_checklist.md
reference/preminst_package.md
SD-2077 print Completed n n 2 reference/myr_euro_conversion_repair_miss.md reference/cfg_print_docs_template_configuration.md
reference/serdica_pdfgeneration_docx_templates.md
euro
SD-2006 premium Completed n n 6 reference/pr_basic_product_documents_lov.md
KI-010
feedback/product_4710_terminology.md
feedback/product_4710_no_revert_to_application.md
feedback/policy_no_seq_per_office_default.md
KI-022
KI-023
reference/agent_participant_attrc_gap.md
reference/cfg_agent_gen_commission_rules_gap.md
код; код
SD-1941 product_cfg Pending* Y n 4 reference/insis_archiver_ora00257_policy_no_halt.md
KI-018
reference/serdica_branches.md
reference/fileserver_identifiers_and_store.md
reference/ipal_korekciya_manual_override.md
KI-016
KI-018
reference/policy_no_eq_sr_policy_id_post_transfer.md
reference/policy_no_generation.md
липсва,конфигурация; липсва,конфигурация
SD-2035 annex Completed n n 13 KI-013
KI-024
KI-025
KI-026
SD-2177 other Completed n n 11 reference/register_policy_one_shot_from_db.md
reference/2215_home_add_dependent_lov_ui_gap.md
KI-017
KI-018
KI-020
KI-035
2215; 2215
SD-1961 access Under investigation* n n 2 feedback/recurring_manual_fix_escalate_to_config.md
reference/icusers_picker_comp_name_quote_search.md
reference/register_policy_one_shot_from_db.md
reference/2215_home_add_dependent_lov_ui_gap.md
reference/agent_participant_attrc_gap.md
reference/commission_hold_transfer_comparator_gap.md
отново; посредник
SD-1789 bso Completed n n 1 reference/assistance_card_numbers.md reference/bso_format.md карта
SD-1986 transfer Under review* n n 2 reference/ipal_korekciya_manual_override.md reference/myr_policy_missing_last_row_pattern.md
reference/myr_state_minus2_policy_no_block.md
корекция
SD-1858 framework Completed n n 3 reference/cargo_1101_family_sync.md
reference/cargo_framework_extension_workflow.md
reference/ipal_framework_selector_lookahead.md
SD-1975 cargo_corr Under review* n n 4 reference/franchise_car_level_propagation.md
reference/ipal_korekciya_manual_override.md
KI-038
reference/beth_chat_assistant.md
reference/ipal_customer_sync_flow.md
reference/bgn_eur_conversion.md
reference/bill_blocks_revert_to_application.md
reference/billing_and_installments.md
reference/casco_no_claims_discount_years_based.md
всички; корекция
SD-1969 print Completed n n 1 knowledge/policy_print_recipe.md
KI-030
reference/bi_deductible_days_dimension_transfer_gap.md печат; 002
SD-1992 premium Pending* n n 4 reference/object_credited_partial_amount_cr.md
reference/beth_chat_assistant.md
reference/ipal_customer_sync_flow.md
reference/insis_policy_states.md
reference/ipal_pricing_factor_framework.md
reference/iv_base_codes.md
reference/mermaid_gantt_syntax.md
прод; промяна
SD-1836 product_cfg Under review* Y n 6 KI-051
feedback/aisa_self_discipline_at_write_time.md
project/ki030_2200_clause_limit_config_fix_pending.md
reference/pr_basic_product_documents_lov.md
reference/prop_robbery_strike_cover_object_invariant.md
reference/2200_strike_cover_object_flag.md
reference/field_validation_frameworks.md
reference/ipal_descr_link_chain.md
reference/ipal_pricing_factor_framework.md
обект; 2200
SD-1997 annex Under review* n n 1 reference/object_credited_partial_amount_cr.md
reference/insis_archiver_ora00257_policy_no_halt.md
KI-018
reference/ipal_non_vehicle_object_owner_transfer_gap.md прод; липсва
SD-2003 other Completed n n 6 KI-009
KI-014
KI-021
reference/abacus_promo_campaign_pattern.md
SD-1952 access Completed n n 1 reference/eurobank_mass_payment_file_format.md
KI-013
reference/ipal_routes_product_access.md файл; трансфер
SD-1738 bso Pending* n n 4 reference/bso_format.md
reference/bso_post_issue_maintenance_sequences.md
reference/eisoukr_response_codes.md
reference/insis_policy_states.md
SD-1979 transfer Completed n n 1 reference/ipal_annex_iv_change_pricing_bug.md
reference/ipal_korekciya_manual_override.md
reference/insis_property_address_truncation_100.md анекс; корекция
SD-1847 framework Completed n n 3 feedback/jira_adf_date_node_invisible_in_list.md
project/aisa_next_review_2026_09_02.md
project/bst_health_second_handover_drop_2026_08_09.md
docs/archive/unknown_rules_sd1000-1564_candidates.md
project/sd_1721_promo_65_months_pending_promotion.md
reference/cargo_1101_family_sync.md
reference/cargo_framework_extension_workflow.md
reference/ipal_framework_selector_lookahead.md
2026; 2026
SD-1921 cargo_corr Pending* n n 1 reference/ipal_korekciya_manual_override.md
reference/eisoukr_mtpl_status_service.md
reference/test_eisoukr_simulator.md
KI-031
reference/eisoukr_response_codes.md корекция; еисоукр
SD-1917 print Pending* n n 4 reference/insis_currency_rate_lookup.md
KI-037
reference/bipublisher_direct_runreport_probe.md
feedback/kibana_batch_response_printdocs_array.md
reference/apigateway_endpoints_timeout_architecture.md
KI-011
reference/cfg_print_docs_template_configuration.md
reference/document_generation.md
reference/kibana_log_access.md
нота,дебит; 200,100
SD-1976 premium Under review* n n 1 reference/ipal_cancel_confirm_double_transfer_gap.md
KI-035
reference/hlt_import_person_name_check.md
reference/cargo_1100_single_policy_sync_footprint.md
reference/winforms_layout_traps_and_offscreen_check.md
reference/beth_chat_assistant.md 20000,ora; current,ora
SD-1823 product_cfg Completed n n 4 reference/pr_basic_product_documents_lov.md
reference/prop_robbery_strike_cover_object_invariant.md
KI-035
KI-007
KI-010
reference/insis_property_pdf_inverted_mapping.md
reference/office_getter_transfer_office_chain.md
reference/policy_no_generation.md
reference/policy_no_office_frozen_at_first_transfer.md
2222,2200; 2222,2200
SD-1993 annex Under review* Y Y 3 reference/ipal_completed_process_late_completion.md reference/ipal_completed_process_late_completion.md
reference/ipal_customer_sync_flow.md
reference/kibana_log_access.md
terminated
SD-1995 other Pending* n n 3 knowledge/policy_print_recipe.md
reference/winforms_layout_traps_and_offscreen_check.md
reference/insis_forms_duration_dimension_validation.md
reference/insis_ul_query_mode_and_dual_save.md
reference/insis_policy_states.md
reference/ipal_annex_model.md
reference/policy_sale_channel.md
печат; екрана

DB. Database evidence — Bulstrad QA, STAGING and PROD

All statements SELECT-only over the SQLcl MCP; every subsection carries the queries that produced it, so a re-measurement is a re-run. Page names are today's; the pages these findings were written against were renamed and merged on 03.09.2026 (D88, D94, D96).

Connections used and what they are:

Label Saved connection Host (SYS_CONTEXT) DB User Oracle
QA BST_QA_SRD_CUST (db.serdicaqa.bulstrad.bg) — BST-QA-IPAL-SRD_INTEGR is not in the saved-connection store on this machine ablera-db-actuary orcl1 SRD_CUST 19.15.0.0.0 EE
STAGING BST-TEST-IPAL-SRD_INTEGR (10.239.82.122) ablera-db-test orcl1 SRD_INTEGR 19.15.0.0.0
PROD BST-PROD-IPAL-SRD_INTEGR (10.239.82.109) ablera-db orcl1 SRD_INTEGR 19.15.0.0.0

QA host ablera-db-actuary is the same database the wiki's 01.09 cadence measurement names, so the QA comparison is like-for-like. The QA session ran as SRD_CUST, not SRD_INTEGR; every SRD_IPROD.* and dictionary query resolved, so nothing below is gated by that.

"dev" columns quote the Ablera dev numbers as written in the pricing-factor model, now Stage IPAL § PF-8b (76 products / 2,511 / 4,660 / 16,400; POL 2,261 vs QT 250; 23 products with QT; 170 dual-stage factors).


DB-1 Pricing-factor distribution — QA vs dev vs STAGING vs PROD

DB-1a Headline counts and stage split

SELECT 'products' k, COUNT(DISTINCT product_code) n FROM srd_iprod.pr_pricing_factors
UNION ALL SELECT 'factor_rows',    COUNT(*) FROM srd_iprod.pr_pricing_factors
UNION ALL SELECT 'value_rows',     COUNT(*) FROM srd_iprod.pr_pricing_factor_values
UNION ALL SELECT 'dependent_rows', COUNT(*) FROM srd_iprod.pr_pricing_factor_dependent
UNION ALL SELECT 'stage_'||sale_stage, COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY sale_stage
UNION ALL SELECT 'products_with_QT', COUNT(DISTINCT product_code) FROM srd_iprod.pr_pricing_factors WHERE sale_stage='QT'
UNION ALL SELECT 'factors_both_stages', COUNT(*) FROM (
  SELECT product_code, NVL(object_code,'~'), NVL(cover_code,'~'), pricing_factor_code
  FROM srd_iprod.pr_pricing_factors
  GROUP BY product_code, NVL(object_code,'~'), NVL(cover_code,'~'), pricing_factor_code
  HAVING COUNT(DISTINCT sale_stage)>1);
Measure dev (page) QA STAGING PROD
Products 76 59 58 57
Factor rows 2,511 2,409 1,992 1,977
Value rows 4,660 4,164 4,547 5,046
Dependent rows 16,400 25,188 28,779 28,390
SALE_STAGE = POL 2,261 2,223 1,992 1,977
SALE_STAGE = QT 250 186 0 0
Products with any QT row 23 16 0 0
Factors carrying both stages 170 153 0 0

Note: the dependency table is PR_PRICING_FACTOR_DEPENDENT (not _DEP); dev's 16,400 is well below every Bulstrad environment.

DB-1b Products using QT (QA only — the other two have none)

SELECT product_code, COUNT(*) qt_rows FROM srd_iprod.pr_pricing_factors
WHERE sale_stage='QT' GROUP BY product_code ORDER BY 2 DESC;

QA: 4704 (40), 4710 (33), 3407 (24), 1126 (20), 3618 (15), 2215 (14), 2214 (13), 2227 (13), 2204 (6), 1116 (2), 3615 (1), 3801 (1), 4716 (1), 4723 (1), 4728 (1), 4800 (1). Dev's top QT product 9951 (40 rows) does not exist on QA at all (0 factor rows for product 9951); 4704 is 40 on QA vs 52 on dev.

FINDING. The QT/POL split the page measured on dev is a development-database artefact. On the customer's STAGING and PROD the estate is 100 % POL — no QT row, no dual-stage factor, on any product. QA sits in between (16 products still carrying 186 QT rows). The "size of the obsoletion work" is therefore 186 rows on QA and zero on the two customer environments; the question "would any of the 53 POL-only products break if a quote step were added" is moot for STAGING/PROD, which have never carried a QT row.

Resolution. CH-11 → F Re-measured 02.09.2026 on Bulstrad QA/STAGING/PROD: STAGING (1,992 factors) and PROD (1,977) carry SALE_STAGE=POL only — zero QT rows, zero dual-stage factors; QA carries 186 QT rows over 16 products (4704 40, 4710 33, 3407 24 …). The dev distribution (250 QT / 23 products / 9951) does not describe the customer estate; 9951 is absent from QA. CH-17 gains a data point: the QT obsoletion is already the data state on the target branches' databases (STAGING and PROD), whatever the code state is — confirm the code side separately.

DB-1c Column distributions

SELECT * FROM (
 SELECT 'DATATYPE' col, NVL(datatype,'<NULL>') val, COUNT(*) n FROM srd_iprod.pr_pricing_factors GROUP BY datatype
 UNION ALL SELECT 'VALUE_SOURCE', NVL(value_source,'<NULL>'), COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY value_source
 UNION ALL SELECT 'QT_REQUIRED', qt_required, COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY qt_required
 UNION ALL SELECT 'UI_FLAG', ui_flag, COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY ui_flag
 UNION ALL SELECT 'UI_REQUIRED', ui_required, COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY ui_required   -- ORA-00904 on PROD
 UNION ALL SELECT 'POLICY_TABLE', policy_table, COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY policy_table
 UNION ALL SELECT 'PRICING_TYPE', pricing_type, COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY pricing_type
 UNION ALL SELECT 'HAS_DEFAULT_VALUE', has_default_value, COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY has_default_value
 UNION ALL SELECT 'F.STATUS', NVL(status,'<NULL>'), COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY status
 UNION ALL SELECT 'V.STATUS', NVL(status,'<NULL>'), COUNT(*) FROM srd_iprod.pr_pricing_factor_values GROUP BY status
) ORDER BY col, n DESC;
Column QA PROD
DATATYPE LIST 1,045 · BOOLEAN 388 · NUMBER 294 · IV_COV 253 · TEXTAREA 169 · TEXT 104 · IV 47 · IV_COVLIST 30 · IV_CURRENCY 26 · DATE 18 · NULL 18 · FORMULA 6 · IVLIST 6 · STRING 3 · ' ' 2 LIST 1,038 · NUMBER 259 · IV_COV 245 · TEXTAREA 164 · BOOLEAN 89 · TEXT 76 · IV 41 · IV_COVLIST 30 · DATE 13 · NULL 9 · IVLIST 6 · FORMULA 3 · STRING 2 · ' ' 2 (no IV_CURRENCY)
VALUE_SOURCE (top) POV 2,014 · pc.PolAnnexes.PFrequency 91 · NULL 72 · …ObjHouses.EarthquakeFactor 20 · PV 18 · …ObjCar.SteeringWheelRight 13 · …ObjCar.RDate 13 · then ~30 C#-expression variants at ≤10 each (incl. DatesFunctions.CarDateDiffYears(…), decimal.Parse(pc.PolObjectValues…)) POV 1,658 · pc.PolAnnexes.PFrequency 84 · NULL 61 · …EarthquakeFactor 17 · PV 17 · …ObjCar.RDate 9
QT_REQUIRED Y 1,367 · N 1,042 Y 842 · N 1,135
UI_FLAG Y 1,471 · N 938 Y 1,200 · N 777
UI_REQUIRED N 1,380 · Y 1,029 (STAGING: N 1,383 · Y 609) column does not exist
POLICY_TABLE (top) POV 1,906 · ' ' 161 · POL_ANNEXES.PFREQUENCY 91 · PV 27 · OBJ_CAR.R_DATE 23 · OBJ_HOUSES.EARTHQUAKE_FACTOR 20 · ~35 more TABLE.COLUMN variants POV 1,544 · ' ' 144 · POL_ANNEXES.PFREQUENCY 84 · PV 33 · OBJ_CAR.R_DATE 17 · OBJ_HOUSES.EARTHQUAKE_FACTOR 17
PRICING_TYPE BP 1,591 · LD 818 BP 1,241 · LD 736
HAS_DEFAULT_VALUE N 1,909 · Y 499 · B 1 (2227 / DURATION, QT, LIST — an invalid value) N 1,546 · Y 431
STATUS on factors NULL on all 2,409 NULL on all 1,977 (STAGING: all NULL)
STATUS on values NULL 4,045 · M 44 · U 36 · MO 19 · O 16 · A 4 NULL 4,934 · M 51 · U 36 · O 16 · MO 9
STATUS on dependents 366 non-null of 25,188 not measured

FINDING. (1) The pricing-factor model's § PF-7 row "STATUS is populated: A on factors" is dev-only — on QA, STAGING and PROD PR_PRICING_FACTORS.STATUS is NULL on every row; the value-table codes M/MO/O/U/A do exist on all environments (~2–3 %). (2) VALUE_SOURCE confirms the model: ~84 % POV, then a long tail of C# member paths and expressions, i.e. it is the dispatch key and carries code. (3) POLICY_TABLE is a single space on 161 (QA) / 144 (PROD) rows and DATATYPE is ' ' on 2 rows per environment — blank-string, not NULL, so IS NULL predicates miss them. (4) One QA row carries HAS_DEFAULT_VALUE='B', which no reader should accept.

Resolution. CH-12 → F Eight confirming queries run 02.09.2026 on QA and PROD (results in § DB-1c). DATATYPE/VALUE_SOURCE/QT_REQUIRED/UI_FLAG distributions are as modelled; factor STATUS is NULL everywhere in the customer estate (the A seen on dev is not there), value STATUS carries M/MO/O/U/A on ~2–3 % of rows on every environment — still "populated, do not retire by it". Blank-string sentinels (' ') exist in POLICY_TABLE (144–161 rows) and DATATYPE (2 rows); treat TRIM(col) IS NULL as empty. Amend § PF-7's STATUS row: "populated on values; NULL on factors on QA/STAGING/PROD".

DB-1d Hygiene checks

SELECT 'dep_not_null' k, COUNT(*) n FROM srd_iprod.pr_pricing_factors WHERE dependent_on_factor IS NOT NULL
UNION ALL SELECT 'dep_blank_only',        COUNT(*) FROM srd_iprod.pr_pricing_factors WHERE dependent_on_factor IS NOT NULL AND TRIM(dependent_on_factor) IS NULL
UNION ALL SELECT 'dep_no_pipe_nonblank',  COUNT(*) FROM srd_iprod.pr_pricing_factors WHERE TRIM(dependent_on_factor) IS NOT NULL AND INSTR(dependent_on_factor,'|')=0
UNION ALL SELECT 'hasdef_Y_null_default', COUNT(*) FROM srd_iprod.pr_pricing_factors WHERE has_default_value='Y' AND default_value IS NULL
UNION ALL SELECT 'hasdef_N_with_default', COUNT(*) FROM srd_iprod.pr_pricing_factors WHERE has_default_value='N' AND default_value IS NOT NULL
UNION ALL SELECT 'F.descr_link_missing', COUNT(*) FROM srd_iprod.pr_pricing_factors f WHERE f.descr_link IS NOT NULL
        AND NOT EXISTS (SELECT 1 FROM srd_iprod.sr_messages m WHERE m.msg_id=f.descr_link)
UNION ALL SELECT 'F.ui_group_descr_link_missing', COUNT(*) FROM srd_iprod.pr_pricing_factors f WHERE f.ui_group_descr_link IS NOT NULL
        AND NOT EXISTS (SELECT 1 FROM srd_iprod.sr_messages m WHERE m.msg_id=f.ui_group_descr_link)
UNION ALL SELECT 'V.descr_link_missing', COUNT(*) FROM srd_iprod.pr_pricing_factor_values v WHERE v.descr_link IS NOT NULL
        AND NOT EXISTS (SELECT 1 FROM srd_iprod.sr_messages m WHERE m.msg_id=v.descr_link);
-- shape of the non-pipe dependency strings
SELECT pricing_factor_code, COUNT(*) n, MIN(dependent_on_factor) sample FROM srd_iprod.pr_pricing_factors
WHERE TRIM(dependent_on_factor) IS NOT NULL AND INSTR(dependent_on_factor,'|')=0 GROUP BY pricing_factor_code ORDER BY 2 DESC;
Check QA PROD
DEPENDENT_ON_FACTOR set 170 136
… of which blank-string only (' ') 7 4
… non-blank without \| 119 98
… with \| (e.g. AFFINITY_GRP\|policyAttributes.AFFINITY_GRP) 44 (all single-item) not broken out
HAS_DEFAULT_VALUE='Y' with NULL DEFAULT_VALUE 36 (of 499) 80 (of 431)
HAS_DEFAULT_VALUE='N' with a DEFAULT_VALUE 24 not measured
Factor DESCR_LINK not in SR_MESSAGES 60 of 2,366 (75 not in SR_MESSAGES_LNG) 17
Factor UI_GROUP_DESCR_LINK not in SR_MESSAGES 46 not measured
Value DESCR_LINK not in SR_MESSAGES 1,070 of 3,478 1,004

The no-pipe dependencies are dominated by DURATION → DURATION_DIMENSION (81 rows on QA) and the car chain CAR_MODEL/CAR_MAKE/ATTR2/ENGINE_TYPE → CAR_SUBTYPE / CAR_MAKE (≈38 rows): a bare factor code, no |policyAttributes.… path. The Y-with-NULL-default rows are cargo (1100/1101/1102/1103: FREIGHT_DIMENSION, AVERAGE_AGENT, ACTUAL_VALUE, SHIPMENT_DOC), 2227, 4704, 2214, 2222, 4710, 1126, 8000, 4703. The orphan value DESCR_LINKs are mostly literal Bulgarian labels used as ids (1123 FLAG: „Андора“, „Албания“, …), and the orphan factor links are literal text too („Cargo policy type“, 1126_RECONSTR_DATE with a trailing space, COVER, MEMBER_CARD, PF_MANUALLY_CORRECTED).

FINDING. The "pipe" form is the minority (44 of 170 on QA); 119 rows use a bare factor code. Either the model's "every dependency carries a | path" is wrong, or ~70 % of the live rows are in a legacy form the code tolerates — the reader must accept both. DESCR_LINK is used as a free-text label on ~30 % of value rows and on a few factor rows; the SR_MESSAGES join is not a validity test one can enforce retroactively, though it should be for new rows.

Resolution. Added to the pricing-factor failure atlas (Stage IPAL § PF-8) as F: DEPENDENT_ON_FACTOR has two live shapes — CODE|path (44 rows on QA) and bare CODE (119 rows; DURATION→DURATION_DIMENSION, car chain); DESCR_LINK is a literal label on ~1,000 value rows per environment; 36 (QA) / 80 (PROD) factors say HAS_DEFAULT_VALUE='Y' with no DEFAULT_VALUE; one QA row has HAS_DEFAULT_VALUE='B'. The S3 validator should flag all four on new rows and never "repair" existing ones.


DB-2 PR_PRICING_FACTOR_ANNEX

SELECT column_name, data_type, nullable FROM all_tab_columns
WHERE owner='SRD_IPROD' AND table_name='PR_PRICING_FACTOR_ANNEX' ORDER BY column_id;
SELECT COUNT(*) rows_, COUNT(DISTINCT product_code) products, COUNT(DISTINCT pricing_factor_code) factor_codes FROM srd_iprod.pr_pricing_factor_annex;
SELECT owner, name, type, COUNT(*) hits FROM all_source WHERE UPPER(text) LIKE '%PR_PRICING_FACTOR_ANNEX%' GROUP BY owner, name, type;
SELECT owner, name, type FROM all_dependencies WHERE referenced_name='PR_PRICING_FACTOR_ANNEX';
SELECT object_name, TO_CHAR(created,'YYYY-MM-DD') created, TO_CHAR(last_ddl_time,'YYYY-MM-DD HH24:MI') last_ddl
FROM all_objects WHERE owner='SRD_IPROD' AND object_type='TABLE' AND object_name='PR_PRICING_FACTOR_ANNEX';
SELECT COUNT(*) FROM srd_iprod.pr_pricing_factor_annex a WHERE NOT EXISTS
 (SELECT 1 FROM srd_iprod.pr_pricing_factors f WHERE f.product_code=a.product_code AND f.pricing_factor_code=a.pricing_factor_code);
QA STAGING PROD
Table exists yes, 5 columns: PF_ANNEX_ID, PRODUCT_CODE, OBJECT_CODE, COVER_CODE, PRICING_FACTOR_CODE (all NOT NULL) yes yes
Rows 340 501 501
Distinct products 41 42 42
Distinct factor codes 176
Rows whose (product, factor) has no PR_PRICING_FACTORS row 20 (all product 3602) 21
Date column noneORA_ROWSCNSCN_TO_TIMESTAMP raises ORA-08181 (SCN older than the mapping window), so last-modified is UNKNOWN
Table created / last DDL 2025-08-27 (schema copy date) created 2025-08-01, last DDL 2025-08-01 14:20
PL/SQL consumer SRD_CUST.ANNEX_PREM package body, function cCHCover (3 source hits; ALL_DEPENDENCIES agrees) same, SRD_CUST.ANNEX_PREM, 3 hits

ANNEX_PREM.cCHCover(pi_CovPrev, pi_CovNew) returns TRUE when at least one pricing factor listed in PR_PRICING_FACTOR_ANNEX for the cover has a different POL_OBJECT_VALUES.PRM_CVALUE than in the previous annex — the header comment reads "Purpose: Checks for a changed cover … The list of price factors is defined in srd_iprod.pr_pricing_factor_annex … Usage: Any annex without Policy cancellation". Top products by rows on QA: 2200 (49), 2214 (27), 2215 (24), 1116 (23), 1117 (22), 2204 (21), 3602 (20, orphaned), 3618 (20), 3303 (18), 2222 (17), 3304 (15), 3636 (10).

FINDING. The table is not consumer-less — it is consumed by PL/SQL, not by serdica-backend, which is why the C# grep found nothing. It is the per-product list of "premium-relevant" factors that the annex premium engine compares to decide whether a cover changed in an annex. It has 501 rows on the customer environments, 42 products, and a static shape (no date column; created 01.08.2025 on PROD). Nothing writes it at runtime; it is configuration.

Resolution. CH-10 / CH-13 → F PR_PRICING_FACTOR_ANNEX (5 columns, 501 rows / 42 products on STAGING and PROD, 340 / 41 on QA) is read by SRD_CUST.ANNEX_PREM.cCHCover — the annex engine's "did this cover change" test — and by nothing in serdica-backend. A product that supports non-cancellation annexes must list its premium-relevant factors here, or every annex will see the cover as unchanged. 20–21 rows reference (product, factor) pairs with no PR_PRICING_FACTORS row (product 3602 on QA). The pricing-factor model's "three tables" becomes four (Stage IPAL § PF-1); Stage IPAL's lifecycle-scope challenge (CH-20) gains a concrete artefact.


DB-3 UI_REQUIRED

SELECT column_name, nullable, data_type, column_id FROM all_tab_columns
WHERE owner='SRD_IPROD' AND table_name='PR_PRICING_FACTORS' AND column_name='UI_REQUIRED';
SELECT COUNT(*) FROM all_tab_columns WHERE owner='SRD_IPROD' AND table_name='PR_PRICING_FACTORS';
SELECT ui_required, COUNT(*) FROM srd_iprod.pr_pricing_factors GROUP BY ui_required;
QA STAGING PROD
Column present yes, column 26, VARCHAR2, NOT NULL yes, NOT NULL NO — table has 25 columns; ORA-00904: "UI_REQUIRED": invalid identifier
Distribution N 1,380 · Y 1,029 N 1,383 · Y 609 n/a
Table last DDL 2026-03-18 15:36 2025-01-18 22:00

FINDING. The pricing-factor model's § PF-7 verdict — "the compiled model says UI_REQUIRED is absent; wrong, the table has 26 columns and it is NOT NULL" — is true on QA and STAGING and false on PROD. On PROD the compiled EF model (25 properties) and the table (25 columns) agree; emitting UI_REQUIRED there does raise ORA-00904, exactly as the compiled model predicted. The column was added to QA on or before 18.03.2026 and has not been promoted to PROD. Both parties in § PF-7 were right about a different environment.

Resolution. § PF-7 row → F UI_REQUIRED exists NOT NULL on QA (since ≤ 18.03.2026) and STAGING; PROD's PR_PRICING_FACTORS has 25 columns and no UI_REQUIRED (verified 02.09.2026) — a schema drift between environments. An insert script is environment-specific: supply UI_REQUIRED on QA/STAGING, omit it on PROD, and re-check ALL_TAB_COLUMNS at plan time rather than trusting either the compiled model or this page. Add the drift to KI-054 (branch drift) or its DB-side sibling, and to the Stage IPAL plan as an environment-introspection step.


DB-4 PL/SQL change cadence on STAGING (the cadence of Stage Planning § 3b, re-measured)

SELECT TO_CHAR(TRUNC(last_ddl_time),'YYYY-MM-DD') d, COUNT(*) objs, COUNT(DISTINCT last_ddl_time) ts,
       TO_CHAR(MIN(last_ddl_time),'HH24:MI:SS') first_t, TO_CHAR(MAX(last_ddl_time),'HH24:MI:SS') last_t,
       ROUND((MAX(last_ddl_time)-MIN(last_ddl_time))*24,2) span_h
FROM all_objects WHERE owner='SRD_INTEGR' AND object_type IN ('PACKAGE','PACKAGE BODY')
  AND last_ddl_time >= SYSDATE-90 GROUP BY TRUNC(last_ddl_time) ORDER BY 1;
SELECT object_type, status, COUNT(*) FROM all_objects WHERE owner='SRD_INTEGR'
  AND object_type IN ('PACKAGE','PACKAGE BODY') GROUP BY object_type, status;
SELECT TO_CHAR(TRUNC(last_ddl_time,'MI'),'YYYY-MM-DD HH24:MI') minute_bucket, COUNT(*) objs, COUNT(DISTINCT last_ddl_time) ts
FROM all_objects WHERE owner='SRD_INTEGR' AND object_type IN ('PACKAGE','PACKAGE BODY') AND last_ddl_time >= SYSDATE-90
GROUP BY TRUNC(last_ddl_time,'MI') HAVING COUNT(*)>=5 ORDER BY 2 DESC;

STAGING, 90 days to 02.09.2026:

Day Objects Distinct timestamps Span
2026-08-19 173 20 13:44:38–14:11:07 (0.44 h) — 171 objects inside the minute 13:44, 18 timestamps, up to 15 objects per second
2026-08-20 5 5 2.07 h
2026-08-27 3 3 4.41 h
2026-08-28 25 17 6.09 h (9 objects in one minute at 14:05)
2026-08-31 2 2 1.95 h
2026-09-01 3 3 6.75 h

Package status STAGING: 107 PACKAGE valid; PACKAGE BODY 91 valid / 13 INVALID. Of the 173 objects touched on 19.08, 0 were created that day and 11 are INVALID now → a mass recompile, not a deployment of new objects.

Same query on QA (to validate the page's numbers) and PROD (bonus):

QA (page, 01.09) QA (02.09 re-run) STAGING PROD
Active days / 90 13 13 (identical list, 26.06 → 01.09) 6 15
Normal active day 1–7 objects 1–7 2–5 1–10
Largest day 105 on 07.08 across 42 timestamps / 5.4 h 105 / 42 / 5.41 h — confirmed; but 86 of the 105 fall in a 28-second window 13:38:30–13:38:58 (23 timestamps) 173 on 19.08, 171 within one minute 37 on 28.08 across 19 timestamps / 3.9 h
Tightest cluster 7 in 15 s (20.08) 7 objects in 15 s at 14:00:40–14:00:55 (6 timestamps) — confirmed; the 07.08 burst is tighter 15 objects at one second (13:44:50) not broken out
INVALID package bodies not stated 46 of 108 13 of 104 0 of 95

FINDING. (1) STAGING is less frequently changed than QA over this window (6 active days vs 13), contradicting the description "the most frequently changed" — at least for the last 90 days; the description may reflect release weeks rather than a steady state. (2) STAGING's dominant event is one mass recompile (171 objects in a minute on 19.08, nothing created, 11 left INVALID); on that day a timestamp-based poll would have flagged the entire schema — exactly the case the page's "signature, not timestamp" rule exists for. (3) The page's characterisation of QA 07.08 as "not a mass recompile" needs a nuance: 86 of the 105 objects were bumped in 28 seconds — a mass action embedded in a 5.4-hour session. (4) QA carries 46 INVALID package bodies (43 %), STAGING 13, PROD 0 — the sync's health baseline differs sharply per environment, and an apply on QA that triggers dependent revalidation will surface pre-existing breakage that is not the apply's fault.

Resolution. CH-29 → F Re-measured 02.09.2026 on bulstrad-staging (ablera-db-test): 6 active days in 90 (QA 13, PROD 15); normal day 2–5 objects; one mass recompile of 171 SRD_INTEGR packages inside a single minute on 19.08.2026 (0 created, 11 still INVALID). The "most frequently changed" description does not hold for DDL cadence in this window. Baseline invalid package bodies: QA 46/108, STAGING 13/104, PROD 0/95 — the snapshot must record STATUS per object so a post-apply INVALID is attributable. Amend the QA 07.08 line: "105 objects, 86 of them in a 28-second burst".


DB-5 SRD_SUPPORT prerequisites on QA

SELECT username, TO_CHAR(created,'YYYY-MM-DD') FROM all_users WHERE username LIKE 'SRD%' ORDER BY 1;
SELECT banner_full FROM v$version;
SELECT tablespace_name, status, contents FROM user_tablespaces;                                  -- ALL_TABLESPACES: ORA-00942
SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024/1024,1) size_gb, ROUND(SUM(maxbytes)/1024/1024/1024,1) max_gb FROM dba_data_files GROUP BY tablespace_name;
SELECT tablespace_name, ROUND(SUM(bytes)/1024/1024/1024,1) free_gb FROM dba_free_space GROUP BY tablespace_name;
SELECT * FROM user_ts_quotas;
SELECT resource_name, limit FROM user_resource_limits;
SELECT username, profile, account_status, default_tablespace FROM dba_users WHERE username LIKE 'SRD_%';
SELECT parameter, value FROM v$option WHERE parameter LIKE 'Unified%' OR parameter LIKE 'Flashback%';
SELECT policy_name, enabled_option, entity_name, success, failure FROM audit_unified_enabled_policies;
SELECT name, value FROM v$parameter WHERE name IN ('audit_trail','sessions','processes','compatible','recyclebin');
SELECT action_name, COUNT(*), MAX(TO_CHAR(timestamp,'YYYY-MM-DD')) FROM dba_audit_trail GROUP BY action_name;
SELECT * FROM dba_stmt_audit_opts; SELECT * FROM dba_priv_audit_opts;
Prerequisite QA result
SRD_SUPPORT user exists No. SRD_* users present: SRD_ANLT, SRD_AST2, SRD_COMMON, SRD_CUST, SRD_HLT (2025-10-14), SRD_INTEGR, SRD_IPROD (2025-08-27), SRD_NETW (2025-10-14), SRD_PR, SRD_RI, SRD_RI_CFG, SRD_RI_POL, SRD_SYS, SRD_VSN2, SRD_XADMIN. No ABLERA_SUPPORT either.
Oracle version 19c Enterprise Edition 19.15.0.0.0, compatible=18.0.0, non-CDB, single instance orcl1, up since 2025-08-27 10:49
Tablespaces INDX (0 GB used, 32 max), SYSAUX 7.2 GB, SYSTEM 1.2 GB, UNDOTBS1 8.4 GB, USERS 48 GB of 48 GB max with 8.4 GB free (2 files), TEMP. ALL_TABLESPACES is not a real view (ORA-00942); USER_TABLESPACES, DBA_DATA_FILES, DBA_FREE_SPACE all resolved for SRD_CUST
Quotas USER_TS_QUOTAS returns no rows for SRD_CUST → unlimited quota (or via UNLIMITED TABLESPACE)
Resource limits SESSIONS_PER_USER, CPU_PER_SESSION, CONNECT_TIME, IDLE_TIME all UNLIMITED; all SRD_ users on profile DEFAULT*, default tablespace USERS
sessions / processes 1,524 / 1,000
Unified auditing FALSE (v$option), but two default unified policies are enabled (ORA_SECURECONFIG, ORA_LOGON_FAILURES) — mixed mode. audit_trail=DB (traditional).
Traditional audit content dba_audit_trail 8,786 rows 2019-07-23 → 2026-08-24: DELETE 5,383 (last 2022-07-06), SELECT 3,401, EXPLAIN 2. dba_stmt_audit_opts and dba_priv_audit_opts are empty — no statement or privilege auditing is configured today; the rows are historic object-level audits
Recycle bin on
Schema-level DML triggers on SRD_INTEGR/SRD_CUST/SRD_IPROD/SRD_SYS none (ALL_TRIGGERS returns 0 rows for these owners)

FINDING. Nothing pre-exists: no SRD_SUPPORT user, no dedicated tablespace, no profile. All SRD schemas share USERS, which is at its 48 GB max with 8.4 GB free — an append-only snapshot store of package bodies (≈95 packages × N versions × environments) fits, but the store should get its own tablespace with AUTOEXTEND rather than compete with SRD_CUST in USERS. Enterprise Edition means Flashback Data Archive and partitioning are licensed options available for the ledger, if wanted. Auditing: unified auditing is off and no traditional audit options are set, so the Stage Planning § 3b proposal "a unified-audit policy on CREATE/ALTER PACKAGE" would be the first audit policy on this database — it needs a DBA, not just Ablera dev.

Resolution. CH-02 / CH-60 stay [B] (written confirmation still needed) but gain the F preconditions: On QA (02.09.2026) SRD_SUPPORT does not exist; 19c EE 19.15, USERS tablespace 48/48 GB (8.4 GB free), profile DEFAULT with unlimited sessions, unified auditing FALSE, no statement/privilege audit options configured. Request to the DBA: create SRD_SUPPORT with its own autoextend tablespace and a profile with a SESSIONS_PER_USER cap; enable a unified-audit policy on CREATE/ALTER PACKAGE for SRD_INTEGR.


DB-6 Non-production restore / rehearsal capability

SELECT name, log_mode, flashback_on, force_logging, cdb, database_role FROM v$database;
SELECT name, value FROM v$parameter WHERE name IN ('undo_retention','undo_tablespace','db_flashback_retention_target','db_recovery_file_dest','db_recovery_file_dest_size');
SELECT name, guarantee_flashback_database, time FROM v$restore_point;
SELECT retention FROM dba_tablespaces WHERE tablespace_name='UNDOTBS1'; SELECT MAX(tuned_undoretention) FROM v$undostat;
SELECT name, space_limit, space_used, number_of_files FROM v$recovery_file_dest;
SELECT TO_CHAR(start_time,'YYYY-MM-DD HH24:MI') start_t, input_type, status, ROUND(output_bytes/1024/1024/1024,1) out_gb
FROM v$rman_backup_job_details ORDER BY start_time DESC FETCH FIRST 8 ROWS ONLY;
Capability QA STAGING PROD
LOG_MODE NOARCHIVELOG NOARCHIVELOG ARCHIVELOG
FLASHBACK_ON NO (option licensed: Flashback Database/Table/Data Archive TRUE) NO NO
Restore points 0 0 0
undo_retention 900 s, UNDOTBS1 NOGUARANTEE, tuned retention currently 2,770 s 900 s
db_flashback_retention_target 1,440 min (unused, flashback off)
Fast recovery area 25 GB limit, 0 GB used, 0 files
Last RMAN job 2024-07-26 03:05 DB INCR FAILED — the last 8 jobs (19–26.07.2024) all FAILED in 0–1 s, nothing since 2026-09-02 02:02 DB INCR COMPLETED (0.7 GB; 17.4 GB on 01.09) — daily, succeeding COMPLETED 2026-09-02
Recycle bin on

FINDING. QA — the platform's development target and the proposed home of SRD_SUPPORT — has no working backup: RMAN last ran two years ago and failed, NOARCHIVELOG means no point-in-time recovery, flashback is off, there are no restore points, and undo is 15 minutes NOGUARANTEE (so FLASHBACK TABLE … TO TIMESTAMP is good for minutes, not a rehearsal). The only reversible-rehearsal primitives available today on QA are transaction rollback, the recycle bin for dropped objects, and short-window flashback query. STAGING is backed up nightly (also NOARCHIVELOG, so restore = to last night's backup, whole database). PROD is ARCHIVELOG with completed backups.

Resolution. CH-55 → F Measured 02.09.2026: QA has no valid backup (last RMAN 26.07.2024, FAILED), NOARCHIVELOG, flashback off, no restore points, undo 900 s NOGUARANTEE. A complete restore of QA is not possible today; only in-transaction rollback and ≤ 15-minute flashback query are. STAGING: nightly RMAN incremental succeeding, NOARCHIVELOG (restore to last night, whole DB). The rehearsal design must either (a) get QA backups fixed and a guaranteed restore point created before each simulation (needs ARCHIVELOG + flashback on — DBA change), or (b) treat QA rehearsal as non-restorable and rely on effect inventories (CH-81). CH-02 / CH-60 sharpen: the question is not whether SRD_SUPPORT is in the QA backup inventory — there is no QA backup inventory to be in. This is the single most consequential finding of the sweep; the git mirror of Stage Planning § 3b is currently the only durable copy of anything on QA.


DB-7 Identical-fix counting — DML / correction logs on QA

SELECT owner, table_name, num_rows, TO_CHAR(last_analyzed,'YYYY-MM-DD') analyzed FROM all_tables
WHERE owner IN ('SRD_INTEGR','SRD_CUST','SRD_SYS','SRD_IPROD')
  AND (table_name LIKE '%LOG%' OR table_name LIKE '%AUDIT%' OR table_name LIKE '%CORRECT%' OR table_name LIKE '%SUPPORT%'
       OR table_name LIKE 'HIST%' OR table_name LIKE '%_HIST' OR table_name LIKE '%TRACE%' OR table_name LIKE '%FIX%')
  AND table_name NOT LIKE 'XX%' AND table_name NOT LIKE 'Z%' ORDER BY 1,2;
SELECT operation_type, COUNT(*), MIN(operation_date), MAX(operation_date), COUNT(DISTINCT operation_user) FROM srd_cust.audit_logs GROUP BY operation_type;
SELECT end_point_type, COUNT(*), COUNT(DISTINCT model), MIN(created_on), MAX(created_on) FROM srd_integr.dbtools$mcp_log GROUP BY end_point_type;
SELECT owner, COUNT(*) FROM all_triggers WHERE owner IN ('SRD_INTEGR','SRD_CUST','SRD_IPROD','SRD_SYS') GROUP BY owner;
Owner.Table Rows (stats) What it is Joinable to a fix signature?
SRD_CUST.AUDIT_LOGS 21 Application audit: OPERATION_TYPE ∈ {DELETE_CLM_OBJECTS_AMNT 12, DELETE_CLM_OBJECTS_AMNT_DET 9}, SOURCE_ID, LOGS, OPERATION_DATE (2026-03-27 → 08-31), OPERATION_USER (4 users), ATTRC1-4/ATTRN1-4/ATTRD1-2 Only for the two claims-amount delete operations the app itself logs. Shape (type + source id + user + date) is the right one, coverage is ~0 %.
SRD_INTEGR.DBTOOLS$MCP_LOG (also in SRD_CUST 527, SRD_IPROD 31) 1,559 SQLcl MCP's own log — every statement AISA ran through the MCP since 2025-09-10, with MODEL, END_POINT_NAME, LOG_MESSAGE CLOB (the SQL), CREATED_ON/BY. 16 model strings Yes for AISA-originated statements: the SQL text is there and can be hashed into a signature. Blind to Toad / SQL Developer / operator sessions.
SRD_CUST.LT_CLM_AMNT_CORRECTIONS 16 LT_ lookup (ID, DESCR_LINK, CORRECTION_TYPE) — a nomenclature of claim-correction types, not a log No
SRD_INTEGR.MIGR_LOG / UTILITY_LOG / BATCH_LOG 1,196 / 96 / 17 Trace tables (F_NAME, TRACE_MSG, TSTAMP) — pipeline traces, no subject key No (free text; needs LIKE '%id%')
SRD_INTEGR.ABC_POLPR_LOG / ABC_POLPR_ERROR_LOG 12,362 / 558 ABACUS pricing call log (INSIS Forms / MATRICA path per memory) No — it logs pricing calls, not corrections
SRD_INTEGR.POL_PPLAN_LOG, HLT_INVOICE_LOG, CLM_COMM_LOG 4,738 / 376 / 51 Domain logs (payment plan, health invoices, claim comms) No
SRD_*.DATABASECHANGELOG 373 / 333 Liquibase — last SRD_IPROD changeset 2023-10-13 No (schema migrations only)
SRD_SYS.SR_MSGLOG, USER_LOGIN_ATTEMPTS 11 / 576 messaging, logins No
Oracle traditional audit (DBA_AUDIT_TRAIL) 8,786 historic object audits; no statement/privilege audit options set; last DML audit row 2022 No — nothing captures operator DML today
DML triggers on the four schemas 0 No trigger-based history exists on the IPAL side (the LOG_AFTER_POLICY/HIST_* pattern is INSIS)

FINDING. There is no table on QA IPAL that records operator or support DML against policy data. The only structured audit is the SQLcl MCP's own log — which captures what AISA ran, with the SQL text, but nothing that Toad, SQL Developer or a colleague's script did. A fix signature (target table + column + fix shape) therefore cannot be joined to anything that exists; it has to be written by the platform at apply time (the SRD_SUPPORT ledger), and DBTOOLS$MCP_LOG is the only source from which v1's historic fixes could be back-filled — and only the fraction that went through the MCP.

Resolution. CH-39 stays C but with the frame fixed as F: No DML/correction log exists on QA IPAL (02.09.2026): 0 triggers on SRD_INTEGR/SRD_CUST/SRD_IPROD/SRD_SYS, no Oracle statement audit options, app-level AUDIT_LOGS covers two claims operations only. The fix signature is recorded by the platform at apply, not derived from the database; SRD_INTEGR.DBTOOLS$MCP_LOG (1,559 AISA statements since 10.09.2025, SQL text in LOG_MESSAGE) is the one back-fill source for v1's recurring families and is blind to non-MCP sessions.


DB-8 Cross-cutting corrections to the wiki (all F, 02.09.2026)

  1. Stage IPAL § PF-7UI_REQUIRED: present NOT NULL on QA/STAGING, absent on PROD (25 columns). Both the compiled model and the page were right for different environments; inserts are environment-specific.
  2. Stage IPAL § PF-7STATUS: NULL on every factor row on QA/STAGING/PROD (dev's A is not in the customer estate); value STATUS M/MO/O/U/A is on ~2–3 % everywhere.
  3. Stage IPAL § PF-7PR_PRICING_FACTOR_ANNEX has a consumer: SRD_CUST.ANNEX_PREM.cCHCover (annex "cover changed" test). 501 rows / 42 products on STAGING+PROD.
  4. Stage IPAL § PF-8b — STAGING and PROD are 100 % POL; QA 186 QT rows / 16 products; product 9951 does not exist on QA.
  5. Stage IPAL § PF-8b — dependency shapes: bare-code (119) outnumbers CODE|path (44) on QA.
  6. Stage Planning § 3b — STAGING cadence 6 active days / 90 with one 171-object recompile minute; QA 07.08 contained an 86-object 28-second burst; INVALID bodies QA 46, STAGING 13, PROD 0.
  7. Failure and Recovery § 5 / Software Architecture § 10 — QA has no working backup (last RMAN 26.07.2024 FAILED), NOARCHIVELOG, flashback off, no restore points.
  8. WorkspaceBST-QA-IPAL-SRD_INTEGR is not in this machine's SQLcl connection store (QA reached via BST_QA_SRD_CUST); memory/project/sqlcl_connections_state.md should be corrected.

Not done / not verifiable here: last-modified of PR_PRICING_FACTOR_ANNEX (no date column, SCN too old); DBA_* views on STAGING/PROD were not exercised beyond v$database/RMAN; PROD dependent-STATUS and UI_GROUP_DESCR_LINK counts were skipped to keep PROD light.


RE. Repository evidence — serdica-backend and the workspace

Read-only pass over serdica-backend (origin/master, origin/bulstrad-qa, origin/bulstrad-staging, origin/bulstrad-prod, origin/codex/health-ai-csharp-architecture), serdica-infrastructure (local clone C:\dev\serdica-infrastructure-health-ai-services, HEAD), and the workspace files. No checkout, no database. Citations are path@branch:line. Verdicts: F now a fact · P decision proposal for Vladimir · C still open, with what is missing.

Register ids as the register stood on 02.09.2026; it has been regenerated several times since and these ids no longer resolve: 1→CH-10, CH-13 · 2→CH-14 · 3→CH-25 · 4→CH-57 · 5→CH-47 · 6→CH-75 · 7→CH-39 · 8→CH-50, CH-66, CH-69 · 9→CH-26 · 10→(no row; fed the configuration-summary challenge) · 11→CH-05, CH-30, CH-49 · 12→CH-19.

Where a section's conclusion was later decided differently, the section says so.


RE-1 PRICING_TYPE and PR_PRICING_FACTOR_ANNEX consumers — CH-10, CH-13

Challenge. PRICING_TYPE has no behavioural consumer; PR_PRICING_FACTOR_ANNEX exists as a table with no consumer in code — establish what writes and reads it.

What I did. git grep -n -i -E "PrPricingFactorAnnex|PR_PRICING_FACTOR_ANNEX" on origin/bulstrad-staging and origin/master; git grep for PricingType / PRICING_TYPE on both, excluding DBModels/migrations/EntityTypes; read every hit on master; git cat-file -e per branch; git log --diff-filter=A for the entity.

Finding. - Staging has zero references to the annex table — the grep on origin/bulstrad-staging returns nothing. The table is unknown to the staging (and prod) code base. The entity exists on master, bulstrad-qa and the codex branch only; absent on bulstrad-staging and bulstrad-prod. First commit carrying it: b425b15e53 2025-10-10 (Preslav Petkov, "register par claim notification"). - Shape: src/PolicyAdministrationSystem/__Libraries/Ablera.Serdica.DBModels.IPAL/DBModels/IPAL/PrPricingFactorAnnex.cs@master:6-18 — five columns: PfAnnexId, ProductCode, ObjectCode, CoverCode, PricingFactorCode. Mapped to SRD_IPROD.PR_PRICING_FACTOR_ANNEX with unique key (ProductCode, CoverCode, ObjectCode, PricingFactorCode)IPALDbContext.cs@master:9136-9140. - Readers (master): - PasPremium.Service/Services/PremiumEngine/CalculationContextLoader.cs@master:75-78 loads all rows for the policy's product into CalculationContext.AnnexPricingFactors (PasPremium.Plugin.Base/Models/CalculationContext.cs@master:17). - PasPremium.Service/Services/PremiumEngine/CoverChangeDeterminer.cs@master:109-121 GetAnnexPricingFactors: if the product has rows in the annex table, those factors are the change-sensitive set (IsRequiredForChange = true for every row); otherwise the fallback is PR_PRICING_FACTORS rows with SALE_STAGE = 'POL', where QT_REQUIRED = 'Y' marks the factor as change-sensitiveAblera.Serdica.Ipal.ChangeDeterminer/Models/AnnexPricingFactor.cs@master:12-29. - Ablera.Serdica.Ipal.ChangeDeterminer/Services/IpalCoverChangeDeterminer.cs@master:87-131: PolicyPricingFactorsChanged (factors with no object/cover scope, compared over POL_VALUES) and ObjectPricingFactorsChanged (factors scoped to the object type + cover, compared over POL_OBJ_VALUES) — a changed value of a listed factor raises CoverChangeReason.PolicyPricingFactorChanged / ObjectPricingFactorChanged, i.e. the cover counts as changed on the annex and is re-rated. - PasHealth.Services/Services/DependentPolicyChangeDetector.cs@master:334-356 — the same override-then-fallback pattern for the health dependent-policy detector. - Writers: none in code on any branch (no Add/insert). The table is configuration, written by hand or by a configuration script. - PRICING_TYPE: on staging the only non-model references are the generated GraphQL setters Ablera.Serdica.GraphQL.WebServer/Schema/Models.Generated.cs@bulstrad-staging:81524,81580 (pass-through) and the EF mapping; on master none outside DBModels. No branch branches on BP vs LD.

Resolution. - F PR_PRICING_FACTOR_ANNEX is the per-product annex change-sensitivity list: which pricing factors, when their value differs between the annex and the previous state, force the cover to be re-rated. When a product has no rows, PR_PRICING_FACTORS(SALE_STAGE='POL', QT_REQUIRED='Y') is that list — which gives QT_REQUIRED a second meaning on master/qa that the pricing-factor model (Stage IPAL § PF-) does not carry yet. Nothing writes it; it exists only on master, bulstrad-qa and the codex branch, so a product configured on staging or prod cannot use it. - F PRICING_TYPE has no behavioural consumer on staging or master. - F The DB count was out of scope for this pass but was taken the same day by the database pass, measured 02.09.2026: 501 rows / 42 products on STAGING and PROD, 340 / 41 on QA* — the query is in § DB-2 of this page.


RE-2 The pageSize:-1 truncation cap — CH-14

Challenge. The branch difference is confirmed, the cap value is not.

What I did. git show d7f8c72210; git branch -r --contains; grep MaxPageSize / DefaultMaxPageSize on all four branches; compared the PagingHelper per branch.

Finding. - Staging: commit d7f8c72210 2026-08-19 "Clamp the no limit requests" (Vladimir Moushkov). src/Common/CommonCustomLibraries/Ablera.Serdica.CrudBaseServices/Helpers/PagingHelper.cs@bulstrad-staging:11DefaultMaxPageSize = 25000. Applied in BaseMainService.cs@bulstrad-staging:258 and Services/Crud/CrudOperations/GetListCrudOperation.cs@bulstrad-staging:109. A page size of -1 (or any non-positive value) becomes one page of the cap; MainServiceConfig.MaxPageSize = 0 means the default, a negative value disables the cap (Config/MainServiceConfig.cs@bulstrad-staging:16-21). The only service that configures it: src/BusinessInsurance/PasNotes/App/appsettings.json@bulstrad-staging:133"MaxPageSize": 100. ⚠ The XML doc comment on MainServiceConfig.MaxPageSize says "(1000)" while the constant is 25000 — a stale comment. - Master and bulstrad-qa: commit a44b7e21c8 2026-08-30, same title, different path src/PolicyAdministrationSystem/__Libraries/Ablera.Serdica.CrudBaseServices/Helpers/PagingHelper.cs@masterDefaultMaxPageSize = 1000; no appsettings.json sets MaxPageSize on either branch. - bulstrad-prod: no PagingHelper, no clamp — BaseDataService.cs still treats pageSize <= 0 as "no paging" (unbounded). - Unrelated MaxPageSize constants exist on master in the Claims services (200) and RevoxyMaxPageSize (100) — per-endpoint, not the CRUD clamp.

Resolution. F The server cap for pageSize:-1 on CRUD "get list" requests is 25 000 rows on bulstrad-staging (100 for PasNotes), 1 000 rows on master and bulstrad-qa, and no cap on bulstrad-prod. Configurable per service through MainServiceConfig.MaxPageSize. The two branches carry different defaults under the same commit title — whoever promotes staging→prod or merges master→staging must pick one number; the staging doc comment should be corrected to match.


RE-3 Microservice endpoints and core's appsettings.json — CH-25

Challenge. "Some microservice endpoints also register in core's appsettings.json" — trace one recently added endpoint end to end and state the rule.

What I did. Read Ablera.Serdica.Microservice.Initializer.EndpointsRegistration/Initializer.cs, every reader of EndPoints/EndpointSections, every reader of RabbitMQRoutingConfig, MessageHandler.TryResolveRouteConfig, and the RouteConfigs block of core's appsettings; git log -S for the example key and for the prefix-match code.

Finding. - DB registration is automatic. src/__Libraries/Ablera.Serdica.Microservice.Initializer.EndpointsRegistration/Initializer.cs@master:29-121: at startup each microservice upserts its EndpointSections row (Name = SectionName, ExchangeName) and one EndPoints row per endpoint map (Name, Command, Action, AllowedRoles, Timeout, input/output JSON schemas). No hand work: deploying the service creates the rows. - Callers that resolve from the DB: the REST gateway Ablera.Serdica.RestApi.WebServer/Services/MessageBus/MessengersManager.cs@master:55-90 builds one messenger per EndpointSections row (exchange = ExchangeName, route key <exchange>.request, reply queue <exchange>.response.to.rest-api.<instance>); service-to-service RPC Ablera.Serdica.Microservice.Rpc/MicroserviceRpcClient.cs@master:70-105 resolves (section, command) through EndPoints<exchange>.request and the endpoint timeout. Neither reads appsettings. - Core is the exception. src/Serdica/Core/Core/Services/MessageHandler.cs@master:82 takes routeMap = RabbitMQRoutingConfig.RouteConfigs; TryResolveRouteConfig@master:552-575 matches the exact command key, else the longest key K such that the command starts with K. (section-prefix match, added by b6a7d75d32 2026-02-17 "Health Policy Actions implementation" — present on master and bulstrad-qa, absent on bulstrad-staging); otherwise IncorrectCommandException (:297-299, :354-356). RegisterTopologies@master:250-272 declares exchanges/queues/bindings from the same map; Program.cs@master:161-169 and MessageBus/RabbitBrokerConfigurator.cs@master:47-50 pre-create the exchanges. - The table: src/Serdica/Core/Core/appsettings.json@master:136-137 (RabbitMQRoutingConfig.RouteConfigs), 1 057 "Exchange" entries on master; src/Core/Core/appsettings.json@bulstrad-staging 1 021 entries (every command listed — no prefix match there). - Worked example: pas_health_manager.open_policy_for_change — appsettings entry added by 044455a364 2025-12-30 (appsettings.json@master:162-167, exchange pas_health_manager); consumed by the Camunda service task WorkflowEngine/ProcessServices/PolicyChangeServiceTasks.cs@master:620-625 via FireRequestToMicroserviceConsumer, with the comment "must be configured in RabbitMQRoutingConfig" (:620-621). The section-level key "pas_health_manager" (:155-160) already covers it on master by prefix, so the specific entry is redundant there — and mandatory on staging.

Resolution. F The rule: a new endpoint always gets its SRD_SYS.EndPoints / EndpointSections rows for free from the owning service's start-up registration; the REST gateway and service-to-service RPC resolve from those rows. A core appsettings.json entry is needed only when Core itself (a workflow service task through MessageHandler) sends the command — and on master/qa one entry per exchange section suffices because of prefix matching, while on bulstrad-staging every command needs its own entry. A new product needs no core entry unless it introduces a new microservice or exchange that Core calls. The wiki sentence should say "commands Core sends", not "some endpoints".


RE-4 Ablera.Serdica.CiJobsBuilder invocation recipe — CH-57

Challenge. Read Program.cs on master before generating.

What I did. Read tools/Ablera.Serdica.CiJobsBuilder/Program.cs@master in full, listed the tool folder, found the .gitlab-ci.yml includes and the template folder.

Finding. - Invocation (from the repo root): dotnet run --project tools/Ablera.Serdica.CiJobsBuilder -- -s src -o .gitlab-ci/autogenerated [--sdk 9.0] [--alpine 3.19] [--code-quality-dotnet-scanner-tag scanner-dotnet-9.0] [--security-scanner-service-tag 0.63.0-ablera3]; -v <template> prints a template; -h help. Switch map Program.cs@master:23-36, defaults :11-14, usage text :44-70. - Inputs: every *.csproj under --src, classified (Program.cs@master:379-393): path contains /__Libraries/ → Library; /__Integrations/ and not an app → Library; /__Plugins/ → Plugin unless the name contains .Base. → Library; SDK Microsoft.NET.Sdk.Web / .Worker or an exe → Application; else Library. Test projects are skipped (:400-404). Templates: tools/Ablera.Serdica.CiJobsBuilder/templates/{docker-app.sbn, docker-plugin.sbn, gitlab-ci.sbn} (Scriban). - Outputs: <ProjectDir>/../<ProjectName>.Dockerfile — written only if missing or its first line carries generated-by: Ablera.Serdica.CiJobsBuilder (:149-176, custom Dockerfiles are skipped); .gitlab-ci/autogenerated/microservices/<kebab>.yml for applications and .../plugins/<kebab>.yml for plugins (:180-184) with jobs build_<kebab>, push_<kebab>, code_quality_<kebab>, scan_<kebab> extending .build_job_svc, .push_job_svc, .code_quality_job_svc_rules, .scan_job_svc_rules (:191-208); changes: = the project folder, its transitive project references, the Dockerfile and the yml itself. Stale ymls are removed by SafeCleanAutogeneratedDir, which refuses any path outside .gitlab-ci. Exit code 0 = nothing changed, 1 = files updated, -1 = error. - Wiring: .gitlab-ci.yml@master:6-8 includes .gitlab-ci/autogenerated/*.yml, microservices/*.yml, plugins/*.yml; shared job templates in .gitlab-ci/templates/{build-job,push-job,deploy-job,code-quality-job,test-job,variables,before-script}.yml; 96 autogenerated files on master. No CI job runs the builder — it is run locally and the outputs are committed. tools/Ablera.Serdica.CiJobsBuilder/tools/Ablera.Serdica.CiJobsBuilder/apply_changes.ps1 is an empty file (0 bytes).

Resolution. F A new deployable (application or plugin) gets its Dockerfile and build/push/scan jobs by running the builder locally from the repo root and committing <Service>.Dockerfile plus .gitlab-ci/autogenerated/<kind>/<kebab>.yml; the deploy job (.gitlab-ci/configs/deploy-jobs.yml, templates/deploy-job.yml) is not generated and stays hand-written — CH-58/CH-63 remain with Ablera DevOps.


RE-5 Cross-service message ordering — the reused contract's message id — CH-47

Challenge. Over RabbitMQ the outbox gives at-least-once delivery; handlers must be idempotent on message id — verify the reused ServiceActivity contract carries one.

What I did. Listed and read every file of src/Serdica/Ablera.Serdica.AI/Ablera.Serdica.Workflow.ServiceActivity.Contracts on origin/codex/health-ai-csharp-architecture; grepped the branch for idempotency terms.

Finding. (all @codex/health-ai-csharp-architecture, path prefix src/Serdica/Ablera.Serdica.AI/Ablera.Serdica.Workflow.ServiceActivity.Contracts/) - Request AiActivityRequestV1.cs: attemptId :24, dispatchId :27, requestHash :36 (sha-256 of a canonical projection, verified in Validate :58-63). No eventId. Identity is (workflowExecutionId, stepExecutionId, attemptId); ValidateExactReplayOf :66-81 accepts a re-delivered request only if the identity matches and the bytes are identical (ACTIVITY_REPLAY_IDENTITY_MISMATCH / ACTIVITY_REPLAY_CONFLICT) — duplicate delivery is idempotent by construction; ValidateContinuationOf :83. - Completion AiActivityCompletionV1.cs: eventId :13, attemptId :25, dispatchId :28, requestHash :34, plus activityTimeline.revision :220. - Revision AiActivityRevisionsV1.cs: eventId :13, sourceCompletionEventId :16, sourceCompletionSha256 :19; ValidateAgainst :70-81 pins the revision to one completion and requires Timeline.ValidateExtensionOf(previous) (AiActivityAuditTimelineV1.cs:117). - Timeline AiActivityAuditTimelineV1.cs: revision (long, positive) :31, previousHeadSha256 :34 (hash chain: null only at revision 1), per-milestone sequence :226 (must equal index+1) and unique milestoneId :229, with a prerequisite-order table for milestone codes :8-17. - Cancel AiActivityCancelV1.cs: eventId :12, cancelId :15, cancelFenceVersion :33 (monotonic fence). - Start StartWorkflowContracts.cs:35: callerIdempotencySha256.

Resolution. F Completions, revisions and cancels carry a message id (eventId); requests carry no eventId but are idempotent through (workflowExecutionId, stepExecutionId, attemptId) + requestHash exact-replay validation; ordering does not depend on transport order — revisions are numbered and sha-256-chained to their predecessor, milestones carry a sequence, cancels a fence version. A handler can therefore dedupe on eventId and reject an out-of-order revision from the contract alone. F The transport envelope carries the id too: src/__Libraries/Ablera.Serdica.RabbitMQ.Client/RabbitPublishContracts.cs@codex:15-21RabbitPublishRequest(…, string MessageId, …, Headers); RabbitConfirmedPublisher.cs@codex:56-64 sets Persistent = true, BasicProperties.MessageId = request.MessageId and a MessageIdHeader header, and on an ambiguous confirm tells the caller to "reconcile by republishing the same ID" (:103-104) — at-least-once with a stable id, as the design assumes.


RE-6 RabbitMQ.Client delta, codex vs master — CH-75

Challenge. Whether the ~500-line supervisor / confirmed-publisher addition should go into master's library — the proposition needs the exact delta.

What I did. git diff --stat origin/master origin/codex/health-ai-csharp-architecture -- src/__Libraries/Ablera.Serdica.RabbitMQ.Client src/__Libraries/Ablera.Serdica.RabbitMQ.Topology; extracted the added public types; read the builder diff; listed codex-only sibling libraries.

Finding. - 13 files, +632 / −6 lines (net +626). Ablera.Serdica.RabbitMQ.Client/: AGENTS.md +21, .csproj +6 (TreatWarningsAsErrors, Microsoft.Extensions.{DependencyInjection.Abstractions,Logging.Abstractions,Options} 9.0.5), Constants/ConstantsClass.cs +9, RabbitClientBuilder.cs +28/−6, RabbitClientOptions.cs +10, RabbitConfirmedPublisher.cs +147, RabbitConnectionSupervisor.cs +194, RabbitPublishContracts.cs +49, RabbitTraceContext.cs +49. Ablera.Serdica.RabbitMQ.Topology/: AGENTS.md +19, RabbitTopologyServiceCollectionExtensions.cs +1, IRabbitStrictTopologyValidator.cs +8, RabbitStrictTopologyValidator.cs +91. - New public types: IRabbitConnectionSupervisor : IDisposable, RabbitConnectionSupervisor, RabbitSupervisorStatus (record), IConfirmedRabbitPublisher, RabbitConfirmedPublisher, RabbitPublishRequest / RabbitPublishResult (records), RabbitPublishOutcome (enum), RabbitClientOptions (Uri, ClientProvidedName, RequestedHeartbeat 30 s, NetworkRecoveryInterval 5 s, ConfirmTimeout 10 s), RabbitTraceContext (static), ConstantsClass, IRabbitStrictTopologyValidator, RabbitStrictTopologyValidator, RabbitTopologyMismatchException. - The six deletions are the placeholder body of AddRabbitClientDefaults (master's comment: "thin placeholder used to stage the extraction"); codex replaces it with AddSupervisedRabbitClient(services, configure, topology) registering the supervisor and confirmed publisher via TryAddSingleton, and keeps AddRabbitClientDefaults() as a wrapper — source-compatible with master's callers. - Codex-only sibling libraries (not in the diff, absent on master): Ablera.Serdica.RabbitMQ.Outbox (3 .cs), .Broadcast (1), .Integration (7).

Resolution. P Proposition to the library owner: fold the 13-file delta into master's RabbitMQ.Client + .Topology — it is purely additive (the only removed lines are a placeholder), keeps the existing extension method, adds no dependency on the health-AI code, and replaces a stated TODO in master itself. Merge Outbox/Broadcast/Integration separately, after the reuse verdicts of Software Architecture § 9 (they carry the health-AI persistence assumptions).


RE-7 Identical-fix signature — CH-39

Challenge. Counting "identical fixes" needs a fix signature — target table + column + fix shape proposed; validate it against v1's recurring families.

What I did. Read KNOWN_ISSUES.md (56 KI entries) and memory/feedback/recurring_manual_fix_escalate_to_config.md; extracted the fix shape and ticket list of KI-030, KI-017, KI-043.

Finding — three families as the register records them.

KI Tickets (from Detected in) Per-incident fix
KI-030 clause-002 limit SD-1824, SD-1963, SD-1969, SD-2068, SD-2159 (5 in 8 weeks; 9 applications) INSIS INSERT INTO gen_risk_limits (insured_obj_id, cover_type='EXPENSE', policy_id, …, 'POLICY', 100, 'EUR', 'P') for product 2200
KI-017 REGNO drift SD-1707, SD-1737, SD-1938 (+ OTRS #00102348); "recurred 4×" IPAL UPDATE srd_cust.obj_car SET regno=…, r_type='PERMANENT' WHERE sr_object_id=… (+ r_date only when NULL)
KI-043 wrong office on debit notes SD-108, SD-113, SD-1917, SD-2043, SD-2144 IPAL SRD_SYS.USER_ACCOUNTS.CURRENT_BRANCH repoint (shape A) or the account's own IC_USERS row moved to the right branch (shape B)

Proposed signature (fields): system (IPAL | INSIS | ABACUS) · table (schema-qualified) · op (INSERT | UPDATE | DELETE) · columns_core (the sorted set of columns always written; optional columns listed separately as columns_variant) · selector (the key column(s) that pick the row — never the value) · discriminator (product code / object type / template name — the configuration axis the fix is scoped to) · value_class per column (constant | copied-from-other-system | operator-supplied). Actual ids and values are excluded, so two policies get the same signature.

Would it have grouped them? - KI-030 → INSIS · GEN_RISK_LIMITS · INSERT · {insured_obj_id, cover_type, policy_id, limit_type, limit_amnt, currency, limit_dimen} · selector policy_id · discriminator 2200/EXPENSE · constantsidentical on all five tickets (and on the SD-1963 re-application after the retransfer). Grouped at the second ticket (SD-1963, 21.07) — five weeks before the root cause was written down on SD-2068. - KI-017 → IPAL · SRD_CUST.OBJ_CAR · UPDATE · core {regno, r_type} · variant {r_date} · selector sr_object_id · discriminator 4704/CAR · copied-from-INSISgrouped (SD-1707, SD-1737, SD-1938) only because r_date is a variant column; a signature on the full column set would have split SD-1737 off. - KI-043 → shape A SRD_SYS.USER_ACCOUNTS · UPDATE · {current_branch} (SD-1917) versus shape B SRD_SYS.IC_USERS · UPDATE · {branch} (SD-2144): the table+column signature splits one mechanism into two families. They share the symptom (debit note stamped with the wrong P_OFFICE_ID) and the consumer (UserSessionService.ExtractSessionInfoPrintSingleDocumentService), not the fix.

Resolution. P Adopt the signature above with columns_core/columns_variant split, and count a recurrence when two cases share (system, table, op, columns_core, discriminator). Treat the count as a trigger for the escalation rule (second identical fix → find the writer of the missing data), not as the family definition: the KI id, once assigned, is the family key, and a second signature key — the consumer code path that exposes the symptom — is recorded so that KI-043-type families (one mechanism, two fix shapes) are joined. Validated on KI-030 (grouped at ticket 2 of 5), KI-017 (grouped, needs the variant split), KI-043 (not grouped by fix alone — hence the consumer key).


RE-8 Retrieval mechanics and the two-independent-uses rule — the measurement and the v1 baseline — CH-50, CH-66, CH-69

Challenge. grep vs vector, and the promotion rule, cannot be judged without the platform — design the measurement and run the grep baseline now.

What I did. Designed the measurement and ran it: scripts/triage_baseline.py. The protocol, the numbers and the per-ticket table are § TB — one measurement, one home. What follows is what this pass adds to them.

Typical misses. SD-1969 (Клауза 002) actually returns KI-030 in its top 5, but counts as a miss because its analysis predates the KI and cites only the reference article — a truth-set artefact worth knowing (the hit-rate is a floor); SD-1858 / SD-1998 (framework extension, Bulgarian "разширение на рамков договор") return nothing because the one-liners are English; SD-2035 (13 truth items, all KIs) returns nothing. The two hits with a KI (SD-1941 → KI-018, SD-1836 → KI-051) came from product codes and system error words present in both the ticket and the title.

Resolution. - F The v1 grep baseline on the migrated one-liner index is 10 % hit-rate at top 5, 98 % false-precedent rate (30 held-out resolved tickets, protocol above, script reproducible). This is the number the retrieval decision of Agents Memory § 7.2 must beat; it also quantifies why v1 memory "did not fire" (Stage Precipitation challenge). - P Measure the alternatives on the same script by swapping only the index: (a) full article bodies instead of one-liners, (b) Bulgarian symptom aliases added to each entry, (c) a vector index (Qdrant or local embeddings) — same 30 keys, same truth, same metrics. Decide grep vs vector on the delta, as the pages say. - C The two-independent-uses promotion rule still cannot be measured: the corpus has no "use" events (which article an analysis actually relied on, versus merely linked). The held-out set above is the right sample; the missing data is a per-case "relied-on" mark, which the ledger will produce — the event named in the register stands.


RE-9 Whitelabel renderer — skill, platform service, or the analysis-HTML toolchain — CH-26

Challenge. Decide with the T0 work.

What I did. Inspected tools/analysis-assets/ (aisa_analysis.css 8.9 KB, aisa_analysis.js 6.9 KB, contract_clauses_bg.json 16 KB), read scripts/finalize_analysis.ps1 (129 lines), read aisa-next/10 Architecture/20 Configuration/contracts/validate_product.py (227 lines, JSON-Schema + semantic rules, fixtures folder) and the whitelabel specification's rendering rule, now Stage Normalization § WS-2.

Finding. - finalize_analysis.ps1 is a marker inliner for hand-authored HTML: it expands <!-- AISA:HEAD/CSS/JS --> and <!-- AISA:CLAUSE:<id> --> markers, computes the asset depth, is idempotent on re-run (scripts/finalize_analysis.ps1:6-22). It renders nothing from data. - validate_product.py is the only code next to the schema; it is Python, reads product.json, recomputes counts from the body, exits 0/1 — the shape of the S1→S2 gate. There is no renderer anywhere in aisa-next/. - The spec fixes the contract: product.json authored, product.md and HTML generated, never edited in place (Stage Normalization § WS-2).

Resolution — taken as D40: the renderer is a skill. The proposal below (a script beside the validator) is what D40 settled on, against the platform-service alternative of Solutions CH-26. P Build the renderer as a sibling Python script in contracts/ (render_product.py: JSON → product.md, and optionally → HTML that emits the AISA:* markers and is finished by finalize_analysis.ps1), invoked by the S1 stage skill right after validate_product.py. Reasons: one toolchain and one fixture set with the validator (the broken fixture must render too); the analysis-HTML assets are reused for the look without adopting a hand-authoring script as a renderer; a platform service has nowhere to run at T0 (Hosting CH-59…63 open) and the contract is unaffected — promote the same script to a platform endpoint when the UI needs on-demand rendering.


RE-10 /configure-product's twelve parts against the five stages — feeds CH-09

Challenge. Map every part to a stage; name parts no stage owns.

What I did. Read .claude/skills/configure-product/skill.md Step 3 (the twelve parts) and the five stage pages plus Configuration Module § 4.

Finding.

# Part (skill) Stage that owns it Evidence
1 Catalogue — product, covers, names, limits/deductibles S3 IPAL Stage IPAL purpose: product, objects, covers + definitions, risks, events, documents, annex types
2 Screen — pricing factors × QT/POL, values, BG labels S3 IPAL (factors, POL-only rule) + S5 Serdica (label sweep) Stage IPAL § pricing-factor rule; Stage IPAL: "serdica stage owns the label sweep"
3 Packages — LB_OFFERS / LB_OFFER_COVERS S4 Offer Stage Offer Apply: LB offers, offer covers, cover values
4 Cover rules — dependencies, conflicts, relative caps S4 Offer Stage Offer Apply: dependency/conflict rules, limit restrictions
5 Tariff — PPA product/version/covers/LD + rating files S2 Abacus Stage Abacus Apply: PPA_* + rating files, deploy
6 Tariff request — ABC_CFG_PRICING_FACTORS none named S2 "builds the factor payload from what the product declares (queried)"; the table itself is not assigned
7 Checks — CFG_FLD_VALIDATION + overrule groups + PR_OPERATIONS none Stage IPAL cites field-validation frameworks only for object codes; no stage lists checks
8 Contract (INSIS) — HT_INSR_TYPE, CFG_GEN_COVERS, conditions, taxes no stage — settled by D85 one PL/SQL script per product with a named owner, not configuration work; the specification has no insis section
9 Seam — CFG_MAPPING_COVERS/_LIMITS/_COVERS_COMM no stage — settled by D85 same script as 8
10 Numbering — CFG_POLICY_NO_SEQ + sequence + grant + synonym S5 Serdica, weakly named in the S5 purpose sentence; no row in the S5 surface table; S3 mentions numbering only as a test side-effect
11 Documents — CFG_PRINT_DOCS + INSIS print register split / weak "documents" in the S3 catalogue list (product documents LOV); "print" in the S5 purpose sentence; no surface row
12 Access — LT_USER_ROLES + SRD_SYS."Routes" S5 Serdica S5 surface rows Views/visibility and Roles
opt. commission, reinsurance, BSO blanks, questionnaire, claims indemnity none not in any stage

Stages also own things the skill does not list: S1 normalization (the specification itself), and S5 endpoints and core registration. Process registration moved to S3 IPAL (D86) — the process key and its task and role bindings belong to the policy product; authoring a BPMN is Development work at Hd.

Resolution. P Amend the stage pages: give Numbering and Documents/print explicit rows in the Stage Serdica surface table (with CFG_PRINT_DOCS cross-referenced from S3 where the product-documents LOV lives); assign Checks (7) to S3 — the tables are IPAL-side and the policy skill is the test that exercises them; assign Tariff request (6) to S2, since getRates cannot run without it; record 8, 9 and the optional five as outside the module — D85 then settled 8 and 9 as one PL/SQL script per product, with no stage, no sub-stage and no transferred proof rung — so every part in the skill has a written owner or a written deferral. Each is an amendment to the stage contract, now Configuration Module § 7.


RE-11 intentgpt — reachability and known seams — CH-05, CH-30, CH-49

What I did. ls C:\dev; .gitmodules on master (none); grep on master; grep + file list on the codex docs; grep in the local serdica-infrastructure clone.

Finding (10 lines). 1. The repository is not on this machine: C:\dev has no intentgpt checkout and serdica-backend has no .gitmodules on master; master mentions it only in tech-debt.md:537 and src/Analytics/riskmodel/run_request.py. 2. It is deployed as the image registry.ablera.dev/ablera/intentgpt (serdica-infrastructure docker-compose.serdica.yml:31, .gitlab-ci/configs/deploy-jobs.yml:217) — so the source is a GitLab project under ablera/ on gitlab.ablera.dev; the path is inferred from the image, not verified. 3. The codex branch carries 573 references in docs/; the dossiers are docs/architecture/health-ai/18-retirement.md, dossiers/d26-retirement.md, and reviews/intentgpt-main-convergence-2026-08-15.md (compares IntentGPT main at 5c518396b; treats it as "a behavior source, not a runtime dependency"). 4. Runtime seam: Python + MCP; Core reaches it through McpProxy — the mcp_proxy.* commands in core's appsettings (call_agent, get_agent_status, call_tool, bethos.*, agents.*, appsettings.json@master:178-231); McpProxy lives in docker-compose.serdica.yml. 5. Consumers (A04 inventory, 18-retirement.md): six UI callers + Core — claims agent-status.service.ts (starts the agent via Camunda, executionId = claimId), PNC pnc.service.ts, reinsurance import-treaty.service.ts, admin agents.service.ts and bethos.service.ts, and Core's MCP tool flows. 6. State seam: MongoDB collections agent_context / agent_session / agent_state plus the Bethos outreach collection; Qdrant as vector index (to be transferred to AI-Manager ownership). 7. Data seam: it mutated Claims directly through GraphQL (16-quality-and-rollout.md:53) and used live GraphQL introspection — both forbidden in the new design. 8. Document seam: its OCR library wraps Azure Document Intelligence (prebuilt-layout/-invoice/-receipt, 06-document-processing.md:49) with a hidden empty-result fallback the C# port removes. 9. Secrets committed in its repo: LLM_KEYS.OPENAI, OCR_MODELS.AZURE_DOC_INTEL, QDRANT.API_KEY, AZURE_BULSTRAD, TRANSLATOR.API_KEY — an immediate hygiene item independent of retirement; it also holds an ablera_insurance LOB mirror. 10. Retirement order: consumers exit → Proxy routes/clients → IntentGPT deployment/secrets → agent-Mongo export → CI guard; CAMUNDA_V1 stays deployable for rollback until then.

Resolution. F The seams above are established from the dossiers; C the repository itself remains unreached — closing needs a clone of gitlab.ablera.dev/ablera/intentgpt (path inferred), which is the "first intentgpt case" the register already names.


RE-12 Loop-back semantics — amend the plan revision or replan — CH-19

What I did. Grepped aisa-next/90 Reference/pc_agent_9951_artifact_extract.txt for resume / revision / re-entry handling and read the passages.

Finding. - The run leaves five working papers — "the plan, the write log, the run log, the build state, and the record of deliberate omissions … what make a run resumable rather than repeatable" (:167). - Re-entry after a failure: "Record completed steps and their returned ids to a state file, stop at the first failure, and resume by skipping what is done. Continuing past a failure manufactures orphans" (:4011; also :1200). - Re-entry on an existing product: "If a row comes back, you are looking at a revision, and the interesting question changes from what is this product to what is the delta" (:2215); "The commonest mistake is treating an update as a build: creating a second product, or rewriting configuration that was already right" (:588). - The gap found later is reconciled against the source document, not the live product, and every difference is either configured or written to MISSING.md with a reason (:640, :3387).

Resolution. P Rule: a re-entered stage amends, it does not replan. It keeps its plan and build state, takes the gap reported by the later stage as a delta item, appends plan revision n+1 (trigger = the gap's id, affected steps, unchanged steps marked kept), applies only the delta through the state file (skip-done semantics), and re-runs its test phase in full so the later stage receives a whole result. Replanning from scratch is reserved for a gap that falsifies a plan premise — one of the "three questions" (process fit, object codes, deployment scope) — and that is a gate to Source (Hd), not a loop-back. Every plan revision is a ledger event and a candidate amendment to the stage contract, now Configuration Module § 7. The 9951 run followed exactly this (state file + revision-as-delta); the rule generalises it.


RE-13 Summary

Item Register Verdict
1 CH-10, CH-13 F purpose established (annex change-sensitivity list; master/qa only; no writer); C DB count unrun
2 CH-14 F 25 000 staging / 1 000 master+qa / none on prod
3 CH-25 F rule stated: core appsettings only for commands Core sends; prefix key per exchange on master/qa
4 CH-57 F recipe written; deploy job not generated (CH-58/63 stay with DevOps)
5 CH-47 F contract ids and ordering fields cited; envelope MessageId set by the confirmed publisher
6 CH-75 P fold the +626/−6 delta into master (additive)
7 CH-39 P signature fields + consumer key; validated on KI-030/017/043
8 CH-50, CH-66, CH-69 F baseline 10 % hit / 98 % false-precedent; P alternatives on the same script; C promotion rule needs "relied-on" events
9 CH-26 P render_product.py next to the validator, reusing analysis assets
10 (CH-09) P ownership table; parts 6, 7, 10, 11 and the optional five need an owner or a written deferral. Parts 8 and 9 were settled by D85 — one PL/SQL script per product
11 CH-05, CH-30, CH-49 F seams from dossiers; C repo still unreached (image path ablera/intentgpt)
12 CH-19 P amend plan revision, replan only on a falsified premise

CE. The case census — what the three modules' work actually is

Taken 07.09.2026 to answer one question per module: are the "typical cases" the module pages carry typical, and what is the real recurring list. Three passes, one per module, each read-only; the reports with the full case lists and the census files are docs/aisa_next_use_cases_2026-09-07/01_data_and_information_cases.md, 02_development_cases.md, 03_configuration_cases.md; the case lists themselves are the three typical-cases pages. Every figure here is F measured 07.09.2026 unless tagged otherwise.

CE-0 Method

CE-1 Desk — 345 analysed tickets by the shape actually worked

Shape n share executed IPAL / INSIS / both · proposed · UI · none
CODE-DEFECT (→ Development) 39 11.3 % 1 / 1 / 0 · 3 · 1 · 33
CONFIG — 15 validation relax/revert + 19 product configuration 34 9.9 % 6 / 2 / 1 · 14 · 1 · 10
TRANSFER-STUCK 29 8.4 % 10 / 0 / 1 · 9 · 8 · 1
ACCESS-USER 26 7.5 % 21 / 0 / 0 · 2 · 0 · 3
PRINT 19 5.5 % 4 / 5 / 0 · 1 · 0 · 9
MYR — multi-year 4704 family 18 5.2 % 5 / 3 / 1 · 5 · 3 · 0
PARTY · MASTER-DATA 15 · 15 8.7 % 2 / 4 / 4 · 4 · 0 · 1 — 8 / 1 / 0 · 5 · 0 · 1
INSTALLMENTS · CARGO-FRAMEWORK-EXT 13 · 13 7.5 % 4 / 1 / 3 · 4 · 1 · 0 — 2 / 1 / 6 · 3 · 0 · 1
PRICING-FIX · ACCESS-AGENT 9 · 9 5.2 %
QUESTION · CR · CARGO-1102/1100 · ACCESS-ROLE 8 · 7 · 7 · 7 8.4 %
VEHICLE-DATA · RESTORE-CANCELLED · EISOUKR-GF · COMMISSION · CARGO-1103 6 × 5 8.7 %
PRICING-EXPLAIN · CARGO-FRAMEWORK-SYNC · BETH 5 × 3 4.3 %
STATUS-DESYNC · POLICY-SYNC · CUSTOMER-DATA 4 × 3 3.5 %
OUTAGE · CAMUNDA · TRANSFER-ROUTINE · PERIOD-DESYNC · KUHA-POLICA · CARGO-TEXT 3 · 3 · 2 · 2 · 2 · 2 4.1 %
other 6 1.7 %
Total 345 93 / 23 / 28 · 79 · 22 · 99 (+1 unknown) — executed 144 (42 %), proposed 79 (23 %), UI 22 (6 %), none 99 (29 %)

CE-2 Development — the customer line since 01.06.2025

serdica-backend serdica-ui
non-merge commits (merges) 300 (15) 134 (7)
commits a month (peak) 18.8 (71 in 07.2025) 8.4 (25 in 07.2025)
SD id in the message / linked through analyses 8 (2.7 %) / 16 (5.3 %) 11 (8.2 %) / 17 (12.7 %)
customer-specific by path (plugin, Bst* service, riskmodel) / mixed 90 (30 %) / 39 (13 %) 24 by product content
same id on master / same subject on master 0 / 171 (57 %) 0 / 91 (68 %)
on bulstrad-prod (id or subject) 222 (74 %) 125 (93 %)
merge-request merges among the merges 0 0
commits carrying .sql / appsettings 3 / 34

CE-3 Configuration — STAGING against PROD, twelve months

Connections BST-TEST-IPAL-SRD_INTEGR, BST-PROD-IPAL-SRD_INTEGR, BST-TEST-INSIS-INSIS (the ABC_ACCESS schema read through the INSIS user's grants — no BST-*-INSIS-ABC_ACCESS connection exists in this workspace), BST-PROD-INSIS-ABLERA_SUPPORT; SELECT only; no @insis distributed query. SRD_IPROD has no audit column on any of its 81 tables; recency comes from three signals — ALL_TAB_MODIFICATIONS (DML since the last statistics gather, per table 2023–2026, flushed irregularly), block-level ORA_ROWSCN bucketed into months by a calibration table (TEST SRD_CUST.SR_USER_NOTES.TSTAMP; PROD POL_ANNEXES / ACCS_POLICIES) — an upper bound, a row counts in the month its block was last written — and a TEST ↔ PROD COUNT(*) + SUM(ORA_HASH(business columns)) diff over 113 tables per product (IDs excluded on the 30 hand-listed tables; JSON_OBJECT(*) hashes on ~60 small tables include IDs and over-report "content differs"). SRD_ANLT.PPA_PRODUCT_VERSIONS carries real dates. The full month × table-group tables, the per-product diff and the SQL are in docs/aisa_next_use_cases_2026-09-07/03_configuration_cases.md § 1 and § 6.

Measure STAGING (TEST) PROD
ABACUS versions (PPA_PRODUCT_VERSIONS) 519 347
4704 · 4710 · 3618 · 3636 template versions 115 · 43 · 18 · 11 71 · 22 · 7 · 2
PPA_FACTOR_VALUES rows 1 708 (650 written 09.2026) 1 133
PPA_PRODUCT_LD rows 29 409 19 630
new products' rating in twelve months 4727 (09.2025) · 2345 (06.2026) · 3606 (07.2026) · 1105 (OPEN 04.09.2026) 4727 · 3606 absent · 2345 absent
CFG_FLD_VALIDATION rows (rules OFF) 552 (29) — written every month 04–09.2026 531 (26)
ABC_ACCESS.CFG_ABC_FLD_VALIDATION 1 063 rows; 108 ins / 1 689 upd / 27 del since 29.12.2025 1 082 rows; last written 04.09.2026
CFG_FLD_VAL_OVERRULED_USERS · _AGENTS · _GRP 1 226 · — · — (9 634 agent inserts / 4 752 deletes) 1 387 · 380 · 144 (2 960 user inserts / 1 506 deletes, last 03.09.2026)
CFG_PRINT_DOCS rows 536 (424 row-blocks 08.2026) 511 (435 row-blocks 08.2026)
CFG_BLANK_NUMBERS rows 928 3.09 M (~100 000 FREE + ~15 000 USED flips a month)
PR_PRICING_FACTORS.UI_REQUIRED column present, 609 Y / 1 379 N over 58 products column absent
4704 PR_BASIC_COVER_DEF · 2222 CFG_FLD_VALIDATION · CFG_VAL_OVERRULED_GRP 32 · 84 · 534 96 · 107 · 441 (PROD ahead)
SR_MESSAGES keys only here 163 624 (600+ НКИД labels)
products with any TEST ↔ PROD difference (104 comparable tables) 117