Measurements — 02.09.2026
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
- 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).
- 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
classificationblock (322 of 332 HTMLs have one). - 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)
- Analysis HTMLs containing an SQL block that starts with UPDATE / INSERT INTO / DELETE FROM / MERGE INTO: 219 of 332 analysed tickets (66%), i.e. 45% of all 485 tickets.
- By request type (share of analysed tickets with a DB write):
- incident/defect: 29/52 (56%)
- question/how-to: 4/10 (40%)
- data correction: 75/106 (71%)
- transfer/sync failure IPAL<->INSIS: 57/79 (72%)
- access/account: 30/35 (86%)
- master data: 9/13 (69%)
- configuration change: 14/20 (70%)
- report/extract: 0/1 (0%)
- CR candidate/new feature: 0/13 (0%)
- other: 1/3 (33%)
- Caveat: the SQL block may be proposed (for Bulstrad-IT / an operator to run) rather than executed by ServiceDesk; the regex does not distinguish. Verification-only analyses (SELECT only) are the complement.
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.
hdesk/: 52 cached OTRS tickets. Title-only classification: configuration change (product spec) 20, other 11, CR candidate/new feature 7, configuration change 4, incident/defect 4, data correction 2, transfer/sync failure IPAL<->INSIS 2, master data 1, access/account 1. These are predominantly product-configuration/CR requests from Bulstrad product owners (3602/3607/3618/3636/4727/2200-2222 tariff and cover changes), i.e. the/configure-productshape, plus a few „куха полица" sync cases.emails/THREADS.md: 38 thread headings. Recurring shapes by title: VIN/рама correction requests 9, куха полица / stuck transfer / sync 6, ИП office / broker onboarding 5. The VIN-correction stream (HelpDesk-originated, e.g.Ticket#00099850_VIN_correction_BG_03_126001300229) rarely becomes a Jira ticket, so the Jira count under-represents it.
TM-9 Caveats (what the heuristics miss)
- The archive is AISA's working set, not the whole SD project; ticket volume per month reflects what was investigated, and 2025 is under-sampled.
- Request type is a first-match keyword rule; a ticket asking for a correction because of a defect lands in "data correction" while the root cause is a defect — the two classes overlap heavily (most data corrections are consequences of transfer defects).
- Bulgarian morphology is handled by stems only; typos in summaries („гтрансфер", „посрдедник") and pure policy-number summaries fall through to description rules or to "incident/defect" by default.
- Skill-candidate Count is the request-side regex only (summary+description) and under-counts requests phrased as a bare policy number; the Analysis-mentions column over-counts because deep analyses mention many subsystems (PREM_INST, ABACUS, EISOUKR, Kibana) even when the fix lay elsewhere.
- One ticket can match several candidates (e.g. a MYR case is also a transfer case); the candidate table is not a partition.
- Effort class is inferred from analysis HTML size and comment count; the v2 analysis template is ~45 KB even for a trivial fix, and 155 tickets have no HTML at all (effort then rests on comment count alone). Real hours were not recorded.
- Contract class/severity/level come from a regex over the HTML classification block; retrofitted v1→v2 analyses (SD-1442…SD-1622) often have a placeholder block, so §/Sev may be absent or defaulted.
- Resolution time uses Jira
resolutiondate, present only for Completed/Closed/Canceled; Pending tickets (the majority of fixed ones) carry none, and snapshotupdateddates equal the fetch day, so median resolution is measured on a 175-ticket subset biased toward tickets the customer explicitly closed. - 73 HTML-only tickets (Mar–Apr 2026) lack reporter and comment count; "(missing)" in the reporter table is that gap, not an anonymous reporter.
- HDesk and email streams were classified by title only; a substantial VIN-correction and framework-onboarding stream lives there and never reaches Jira, so Jira-only counts under-state those two skills.
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):
- (a) snapshot_ts — earliest
SD-<n>_ticket_<ISO>.jsonfilename timestamp = moment AISA fetched the ticket. - (b) first/last commit, n_commits —
git log --name-only -- jira_tickets, aggregated per key. Repo history starts 2026-04-10; two operator machines merge via git, so commits are batched. - (c) mtime_min/max — filesystem mtimes; flagged below as unreliable.
- (d) AISA timeline stamps — first
<td>oftr.timeline-aisa-internal|responserows in the analysis HTML; formatsYYYY-MM-DD[ HH:MM[:SS]],DD.MM.YYYY[ HH:MM],DD.MM HH:MM, bareHH:MM(date taken from the snapshot). Date-only stamps are recorded but not used for elapsed (no time of day). Jirafields.createdfrom the JSON is also kept. - agent_elapsed = (d) last time-bearing AISA stamp − (a) snapshot; else (b) first commit at/after the snapshot − snapshot (the commit that landed the analysis; the last commit is dominated by later bulk edits — retrofits, finalize_analysis re-runs — so
lastcommit_minus_snapshot_his reported as a column but not used); else last − first commit. agent_time = agent_elapsed + 0.25 h operator overhead.elapsed_reliable= timeline-based, or commit-based with elapsed ≤ 24 h (a later commit means the analysis was committed in a batch, not when it was finished). - active_h — events = commits + snapshot + time-bearing AISA stamps, clustered with gap > 4.0 h; sum of cluster windows (a lone event = 0 h). Separates elapsed from active work but is a lower bound (a single-commit session shows 0).
- human_est_h — sum of the hours column of the role × hours × rate table in the
aspect-financialcard (headerЧасове/Дни/Човеко-дниsets the unit; cell unitsч/h/MD/чд/ден/минoverride; 1 day = 8 h; total/colspanrows skipped). human_true_h = 0.25 × human_est_h.fin_checkcompares hours against amount/rate×8 per row (ok if every row within ×0.5–×2).
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
- Elapsed ≠ effort. agent_elapsed is wall-clock between fetch and last AISA stamp/commit; the operator may have been away, or the ticket may have been re-analysed days later (multi-day elapsed values). active_h is the opposite bias (lower bound).
- Commits are batched across two machines and merged; many analyses were committed in bulk (see first-commit dates). Commit-based elapsed is only trustworthy where the snapshot exists and the last commit is close to it.
- mtimes are reset by checkouts/merges — reported in the CSV but excluded from all estimators.
- AISA timeline stamps are written by the analysis author (the agent), sometimes date-only or
HH:MMonly; bareHH:MMis assigned to the snapshot date. - human_est_h is the analysis author's own number (the agent wrote the financial card), scoped to the fix as the author saw it (sometimes includes development + testing of a CR, sometimes only L1 diagnosis). It is not an independent human estimate.
human_true_happlies a flat 0.25 factor (Vladimir's rule of 02.09.2026); D54 then adjusted it to about 0.31 and stated that the medians are the shape of the comparison, not a number for any one ticket. - Tickets analysed before the repo existed (2026-04-10) have no meaningful git start; tickets without a snapshot JSON (legacy v1 dirs) fall back to commit deltas.
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
- Corpus:
jira_tickets/SD-*/directories holding both a ticket JSON snapshot and an analysis HTML — 267 such directories; 216 resolved (newest snapshotstatusCategory = done, or newest snapshot older than 2026-08-01 and presumed resolved since, marked*); 194 of them name at least one precedent. - Query = the ticket as it arrived:
fields.summary+fields.description(ADF flattened) from the oldest snapshot. - Index = what v1 memory offers a grep: the 563
memory/MEMORY.mdone-liners (title + hook + file stem) plus the 56KNOWN_ISSUES.md## KI-### — titleheadings = 619 lines. - Truth: the
memory/reference/*.mdarticles andKI-###ids the ticket's analysis HTML cites (feedback/methodology articles excluded — they are not precedents). - Retrieval: grep-style token overlap — query tokens ≥ 3 chars, stop-words removed, ids > 6 digits dropped, IDF-weighted sum over shared tokens, top 5.
- Hit = any truth item in the top 5. False-precedent rate = share of the 30 × 5 = 150 possible slots not filled by a truth item — the denominator is the possible slots, not the returned ones, because 7 tickets return nothing and several return fewer than five. Sample: 30 tickets, round-robin over ten request-type buckets (access, BSO, transfer, framework, cargo correction, print, premium, product configuration, annex, other), newest first.
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 | 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 | 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 | 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 | none — ORA_ROWSCN → SCN_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)
- Stage IPAL § PF-7 —
UI_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. - Stage IPAL § PF-7 —
STATUS: NULL on every factor row on QA/STAGING/PROD (dev'sAis not in the customer estate); value STATUSM/MO/O/U/Ais on ~2–3 % everywhere. - Stage IPAL § PF-7 —
PR_PRICING_FACTOR_ANNEXhas a consumer:SRD_CUST.ANNEX_PREM.cCHCover(annex "cover changed" test). 501 rows / 42 products on STAGING+PROD. - Stage IPAL § PF-8b — STAGING and PROD are 100 % POL; QA 186 QT rows / 16 products; product 9951 does not exist on QA.
- Stage IPAL § PF-8b — dependency shapes: bare-code (119) outnumbers
CODE|path(44) on QA. - 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.
- Failure and Recovery § 5 / Software Architecture § 10 — QA has no working backup (last RMAN 26.07.2024 FAILED), NOARCHIVELOG, flashback off, no restore points.
- Workspace —
BST-QA-IPAL-SRD_INTEGRis not in this machine's SQLcl connection store (QA reached viaBST_QA_SRD_CUST);memory/project/sqlcl_connections_state.mdshould 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-sensitive — Ablera.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:11 — DefaultMaxPageSize = 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@master — DefaultMaxPageSize = 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-21 — RabbitPublishRequest(…, 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 · constants — identical 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-INSIS — grouped (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.ExtractSessionInfo → PrintSingleDocumentService), 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
- Desk (CE-1). Every analysis HTML under
jira_tickets/(366 files in 362 folders + 16 flat files → 345 unique tickets of 540 folders; 126 bare and ~70 slugged folders carry no analysis). Per ticket a digest — title, created date, executive summary, § 5.1 root cause, § 7.1 internal note, and a regex count of UPDATE/INSERT/DELETE/MERGE — was classified into one primary shape (what the desk had to do) and one ending (write executed in IPAL / INSIS / both · proposed SQL left to Bulstrad IT, an operator or a held batch · UI action · none) by three Opus sub-agents, one at a time, over a 36-label vocabulary seeded from § TM-5; 19 of 19 spot-checks agree at shape level; 30 borderline rows flagged, none changing a verdict. Dates: 228 from the HTML, 83 from the snapshot date, 5 from Jira JSON, 30 legacy tickets interpolated from the ticket number. This is a different denominator from § TM (which counts what the customer asked for by keyword over 485 tickets) and must not be mixed with it. - Development (CE-2).
git log origin/bulstrad-staging --no-merges --since=2025-06-01inserdica-backend(300) andserdica-ui(134), with--name-onlyper commit; shape = regex on subject + touched paths, spot-checked on ~180 rows (± 10 % between neighbouring shapes); "on master / on prod" = same id ingit rev-list, else same subject since 2025-06-01; ticket linkage = SD ids in messages, then file names and same-day dates in the analyses, thengit branch -r. Never a checkout;git ls-treefor file presence (git cat-file -e ref:pathmis-reports under MSYS path conversion). - Configuration (CE-3). See below — taken on STAGING (
10.239.82.122SRD_IPROD/SRD_ANLT,10.239.82.123ABC_ACCESS) against PROD, SELECT only.
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 |
| 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 %) |
- The DB-write denominator re-read. § TM-7's 66 % counts analyses that contain a write statement; reproduced here as 213 of 346 = 62 %. The share of cases in which the desk itself executed a write is 42 %. Both figures stand; they measure different things.
- § TM-5 against CE-1. The keyword counts overstate most shapes two- to four-fold against what the analyses did (retransfer 112 vs 32; installments 30 vs 13; ИП setup 31 vs 9; print 50 vs 19; framework sync 13 vs 5) and keep the order; framework extension (14 vs 13) and MYR (25 vs 18–22) are close.
- Per month (analysed tickets): Mar 20 · Apr 60 · May 57 · Jun 71 · Jul 80 · Aug 51 (+4 outside). Declining: account/agent provisioning (7 → 2 a month), cargo framework sync (none since 26.06.2026). Rising: print (7 in August), status/period desync and restore-after-mistaken-cancel (from July), ЕИСОУКР (3 in August). Flat: MYR ≈ 3, cargo extension ≈ 2, installments ≈ 2 a month.
- Streams outside Jira: VIN corrections 6 Jira vs 12 OTRS mail threads + 1 HDesk; „куха полица" 2 vs 7 threads + 3 HDesk; ИП offices 9 vs 4 threads (stream counts from Challenge Rounds § R2-1).
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 | — |
- Shapes (backend): reinsurance stream 84 (28 %) · small extension without ticket 51 · fix without ticket 37 · print 20 · riskmodel pricing filter 15 · product BPMN 14 · CI 12 · euro changeover 11 · prod → staging reconciliation 10 · master → staging port 9 · revert 8 · integration 8 · appsettings-only 6 · perf 4 · dependency 4 · tooling 3 · GraphQL schema 3 · ticketed fix 1. UI: fix without ticket 41 · extension without ticket 37 · bg number/locale series 14 · ticketed fix 11 · euro 7 · tooling 5 · i18n 4 · the rest 15.
- Lineage facts (git, verified 07.09.2026):
.claude/rules/code-changes.mdis on all four origin refs of both repositories (last touched 14.04.2026 on staging; blob differs from master's);bulstrad-testis the staging branch's former name (renamed 22.10.2025; backend ancestor of staging, UI diverges 29.10.2025);master/staging merge base2a2bdbbca418.03.2025; staging/prod merge basef252a711b621.01.2026 with 111 staging-only and 52 prod-only commits since; UIbulstrad-stagingforce-rewritten 04.09.2026 (backup/bulstrad-staging-pre-rewrite-20260904);src/BusinessInsurance/*on master = 319 files, 0.cs, on staging 2 259.cs; 168.bpmnfiles on staging. - Timing: ticket → staging commit 0–1 day in 11 of 13 measured pairs (17 d SD-1863; 385 d SD-524); staging → prod the same day in 9 of 9 UI and 4 of 6 backend pairs (36 d SD-1863; never for the SD-1709 backend half, the flat rate and the FRAME series as of 07.09.2026); eight tickets in status Next Release have no matching commit (oldest SD-547, 14.07.2025).
- Deploy mechanics (from the staging
.gitlab-ci): the image is built and pushed on push (branch = tag);.deploy_jobruns theserdica-infrastructureAnsible playbookwhen: manual;configs/deploy-jobs.ymlnames onlydemo2andmarketing-demo— the Bulstrad targets live inserdica-infrastructure(D130).
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 |
- STAGING row-blocks last written, twelve months, by group (upper bound): ABACUS tariff 38 121 (10.2025 EUR wave 19 494; 07.2026 5 778) · pricing factors 11 871 · numbering/BSO 11 249 (the 09.2025 policy-year roll) · catalogue/covers 5 756 · mapping IPAL↔INSIS 5 114 · offers 2 048 · validations 1 893 · routes/roles 1 146 · prints 535 · commission 40. Top products: 4704 12 775 · 4710 5 177 · 3443 5 141 ·
ALL3 706 · 2200 3 673 ·GLOBAL3 277 · 2214 3 154 · 3618 2 552 · 2222 2 445 · 3602 2 443. - INSIS TEST (
ALL_TAB_MODIFICATIONS):CFG_GEN_COVER_RULES10 ins / 2 527 upd (30.07.2026) ·CFG_GEN_RISK_LIMITS2 / 621 ·CFG_DISCOUNTS118 ins (1 583 rows, all keyed byCLIENT_GROUP, 0 byCAMPAIGN_ID) ·CFG_QUEST_QUESTIONS/ANSWERS/REFS22 / 52 / 22 ins (21.07.2026) ·CFG_PRINT_DOC*19 + 89 + 38 + 21 (06.08.2026) ·HT_INSR_TYPE1 ins / 20 upd ·CFG_GEN_TARIFF_*139 deletes (INSIS-native clauses retired as ABACUS takes over). 2345 exists on INSIS TEST (HT_INSR_TYPE,AB_CFG_RATE_ABC_ON); 3606, 3410 and 1105 exist in no INSIS environment. - Intake, HDesk (42 configuration tickets, every
_cached_view.htmlread): validation 10 · tariff 10 · discount 6 · questionnaire 4 · nomenclature 3 · new product 2 · new clause 2 · promo 1 · visibility 1 · other 3; INSIS or МАТРИЦА named as target in 38 of 42; ask → first TEST delivery 0–1 day (desk, INSIS), 8–24 days (Ablera, both systems), 56–155 days (cross-system), 287–496 days (ABACUS + IPAL twins, nomenclatures); PROD arrival confirmed 3 of 42; „очаква доработка" 20 of 42; twelve explicit waiting complaints; no ticket mentions an offer or CR. - Intake, Jira (68 tickets, analyses read): kinds — validation relax-and-revert 10 · print defect explained 9 · print data fix 6 · discount rule 6 · numbering 5 · nomenclature 5 · validation permanent 4 · print template configuration 4 · label 4 · BSO 4 · LOV add 3 · cover limit 3 · promo 1 · other 4. Environment applied: PROD 31 · none (proposed or explained) 20 · TEST 7 · both 3 · unclear 7. Executor: Ablera IT 25 · a person running AISA-drafted SQL 14 · Bulstrad IT 11 · none 15. Elapsed to PROD where dated (n = 32): 26 on day 0, 4 on day 0–1, one in 6 days. Recurrence: 30 of 68 name an earlier identical case. About eleven a month, flat 03–08.2026. Most-written tables:
CFG_ABC_FLD_VALIDATION9 ·CFG_PRINT_DOCS8 ·CFG_FLD_VALIDATION7 ·CFG_POLICY_NO_SEQ5. - The code half (from CE-2): product BPMN 11 commits (5 on prod), riskmodel pricing filters 12 (11), print selectors 14 (9),
Add configurable policy date checkswith.sql(17.07.2026), a per-product engine toggle (05.2026, reverted). Every new product on the customer line needed a plugin commit.