Development module — typical cases
What this page is. The recurring shapes of customer-specific development on Bulstrad's line as the two repositories show them, not as the design assumed them. It complements Development Module § 5, whose eight walks (C1–C8) were chosen to stress the architecture; here the only questions are how often does this happen, where in the tree does it land, how does it reach PROD, and what does the module do with it. Nineteen cases, ordered by frequency × pain; each names its commits, its tickets where any exist, its placement seam, its delivery shape and its walk through the stages of Development Module § 1. Shape labels are heuristic — subject plus touched paths, spot-checked by hand — so neighbouring shapes may trade ± 10 %.
0. What the census says F
- The customer line is 300 backend and 134 UI non-merge commits since 01.06.2025 — about 19 and 8 a month, a 71-commit peak in 07.2025 and troughs of 4–5 — written directly on the environment branch: none of the 15 staging merges is a merge-request merge (all are push/pull syncs of the same branch), and the whole estate holds two SD-named branches (
fix/SD-1709-broker-name-search, both repos, 05.2026; an older UIfield-generator-fix-SD-405]-). - Ticket traceability is 2.7 % (backend) and 8.2 % (UI) by commit message, 5.3 % and 12.7 % after hand-linking through the ticket analyses. The rest arrives as HDesk requests, as verbal asks („Client complains about this warning, so it is commented out", 17.07.2025) or as Ablera-internal streams.
- Customer-specific by path: 43 % of backend commits (90 plugin-, customer-service- or riskmodel-only, 39 mixed with shared code); a further 150 commits touch PAS services that exist as code only on the customer line —
src/BusinessInsurance/*onmasterholds 319 files and no.cs, against 2 259.cson staging — so „core file" and „customer file" are not separable on the flat layout. The true customer share lies between 43 % and 93 %. - The largest single stream is the reinsurance module: 84 commits (28 %), one author, 06.2025 → 08.2026, no ticket — a customer-funded module, which the module's charter („never new modules") excludes.
- Nothing reaches
masterby commit id (0 of 300, 0 of 134); 171 (57 %) backend and 91 (68 %) UI subjects reappear there by hand re-application, elevenmastercommits naming their staging source. Ports run in five directions — staging → master, staging → prod, master → staging (9), prod → staging (10 on 15.07.2025), and prod-only work — not the one the module draws.bulstrad-prodcarries 52 re-applied and prod-only commits since the 21.01.2026 merge base. - PROD gets a UI fix the same day as staging in 9 of 9 measured tickets, a backend fix the same day in 4 of 6 (36 days for SD-1863; never, as of 07.09.2026, for the SD-1709 backend half, the flat-rate change and the FRAME series). „Deploy and verify on staging, then cherry-pick" is nominal; H5 will be the first real gate.
- Ticket → staging commit is 0–1 day in 11 of 13 measured pairs (17 d for SD-1863; 385 d for SD-524). The eight tickets in status Next Release (SD-547 since 14.07.2025, SD-1161, SD-1618, SD-1702, SD-1873, SD-2007, SD-2138, SD-2143) have no matching commit — a queue the module never reads.
- A case is a series, not a commit. Seventeen exact-duplicate subjects (
Add a call to DB function ANNEX_PPLAN.PP_generate()× 5 in one week), 43 subjects with series markers (part #2,Reupload,Reapply,Post port fixes,trigger rebuild× 5), 18 revert-type commits. - Two estate facts the module page had wrong or missing.
.claude/rules/code-changes.mdis present on all four origin refs of both repositories (last touched 14.04.2026; the staging blob differs from master's) — the fix rule exists and is not practised; andbulstrad-testis the staging branch's former name (renamed 22.10.2025 in both repos; the backend one is an ancestor of staging, the UI one diverges on 29.10.2025 with two orphan commits). UIbulstrad-stagingwas force-rewritten on 04.09.2026 (backup/bulstrad-staging-pre-rewrite-20260904kept, one commit dropped). - Deployment is a manual job outside the repo. CI builds and pushes the image on push (branch = tag);
.deploy_jobruns theserdica-infrastructureAnsible playbookwhen: manual, and the stagingconfigs/deploy-jobs.ymlnames onlydemo2andmarketing-demo— the Bulstrad targets live inserdica-infrastructure(consistent with D130). Only 3 of 300 commits carry a.sqlfile; theSR_MESSAGES,CFG_PRINT_DOCSandPOLQRYrows the code expects are applied by hand.
| serdica-backend shape | n | share | ticketed (message / any) | customer-only / mixed | on master (subject) | on prod |
|---|---|---|---|---|---|---|
| REINS-STREAM — reinsurance module | 84 | 28 % | 0 / 1 | 16 / 22 | 59 | 66 |
| CUST-FEATURE — small extension, no ticket | 51 | 17 % | 0 / 3 | 9 / 3 | 36 | 38 |
| DEFECT — fix, no ticket | 37 | 12 % | 0 / 1 | 8 / 1 | 22 | 26 |
| PRINT — BstPrintDocuments, template selectors | 20 | 7 % | 7 / 7 | 13 / 1 | 16 | 15 |
| PRICING-FILTER — riskmodel Python | 15 | 5 % | 0 / 1 | 15 / 0 | 11 | 14 |
| PRODUCT-PROCESS — BPMN + user tasks | 14 | 5 % | 0 / 0 | 8 / 5 | 6 | 8 |
| CI-PIPELINE | 12 | 4 % | 0 / 0 | 1 / 0 | 2 | 6 |
| EURO-CURRENCY | 11 | 4 % | 0 / 0 | 6 / 0 | 7 | 11 |
| BRANCH-RECONCILE (prod → staging) · PORT-FROM-MASTER · REVERT | 10 · 9 · 8 | 9 % | 0 | 0 · 0 · 1 | 10 · 7 · 5 | |
| INTEGRATION (INSIS, LDAP, Bul SI, IdentityServer) | 8 | 3 % | 0 / 1 | 6 / 1 | 3 | 7 |
| CONFIG-APPSETTINGS only · PERF · DEPENDENCY · TOOLING · GRAPHQL-SCHEMA · DEFECT-SD | 6 · 4 · 4 · 3 · 3 · 1 | 7 % | 0 / 2 | |||
| Total | 300 | 8 / 16 | 90 / 39 (+7 by subject) | 171 (57 %) | 222 (74 %) |
| serdica-ui shape | n | share | ticketed | on master | on prod |
|---|---|---|---|---|---|
| UI-DEFECT — fix, no ticket | 41 | 31 % | 0 / 1 | 34 | 40 |
| UI-FEATURE — extension, no ticket | 37 | 28 % | 0 / 3 | 27 | 34 |
| UI-LOCALE-NUMBER — bg number and decimal series | 14 | 10 % | 0 | 9 | 14 |
| DEFECT-SD — ticket in the message | 11 | 8 % | 11 / 11 | 5 | 10 |
| EURO-CURRENCY · TOOLING · I18N-LABEL | 7 · 5 · 4 | 12 % | 5 · 0 · 4 | 7 · 2 · 4 | |
| PORT · CI · INTEGRATION · REINS · PRINT · PERF · PRODUCT-PROCESS · RECONCILE | 15 | 11 % | 0 / 1 | 7 | 14 |
| Total | 134 | 11 / 17 | 91 (68 %) | 125 (93 %) |
Seam touches on the backend (a commit may touch several): PAS services 150 · Bulstrad plugins 88 · shared NuGet libraries 39 · platform services 36 · appsettings 34 · Bst* customer services 28 · CI 19 · riskmodel 18 · tests 16 · .sql 3. Product codes in subjects: 4710, 2200, 2222 (× 3 each), 3606, 4704 (× 2), 3408, 3635, 3443, 3607, 4711, 3400.
1. The eight walks, re-read against the census F
| Case | Verdict | Evidence |
|---|---|---|
C1 claims-search on bulstrad-qa |
architecture test — not a customer-line case | Claims has no files on staging or prod; the QA line is master's health lineage. The mixed-seam shape it stresses is real (39 mixed backend commits) but arrives as DV-04 and DV-11, not as a QA feature |
C2 SD-1863 POLQRY stub |
typical (seam 3) | 12 of the 39 code-defect tickets name a SRD_INTEGR package (SD-1550 INS_DM, SD-1574 / 1587 INS_BOF.Deductible, SD-1659, SD-1836 TR_LIB_PROP, SD-1838 cDuplicateMTPL, SD-1927 TR_AFTER_TRANSFER, SD-1964 / 2180 TR_ANNEX_MC, SD-1997, SD-2063 TR_LIB_ACC, SD-2151 ABC_LIB_MOTOR); the C# print half recurs as DV-02 |
C3 formly DEPENDENT_ON_FACTOR |
not a development case — the page says so itself | field-generator.ts was touched seven times on staging; the recurring UI work is validators, dialogs and locale (DV-09, DV-10) |
| C4 port across layouts | typical, not as written | 0 of 434 commits reach master by id, 262 by hand; the example (38 files) is a plugin consolidation, the median port is 1–7 files, and ports also run master → staging (9), prod → staging (10), staging → prod (52 since 21.01.2026) |
C5 per-branch appsettings.json |
typical as a side-effect | 34 of 300 commits bundle it, 6 are appsettings-only; nobody asks for it |
| C6 Camunda process for a product | typical | 14 product-process commits, 168 .bpmn files on the branch; products 3606, 3635, 3408, 3443 / 3607, 3400, 2200 / 2222; four of them have no master counterpart; HDesk 00085986 „нов продукт" → SD-1699 open since 19.05.2026 |
| C7 KI-044 six-owner fix set | architecture test | the incident is real and „incident → clamp" recurs (DV-16, 6 commits); the six-owner matrix happened once |
| C8 clamp as a standard change | typical delivery, rare content | staging first, re-applied to master by the same author eleven days later without a GitLab-issue proposition, UI twin on a fix/ branch; PERF is 4 of 300 |
Four of the eight are typical, one typical in delivery only, two architecture tests, one configuration. The eight miss the seven most frequent real shapes (DV-01 … DV-07).
2. The cases
Format: ask · evidence · placement · delivery · verification · walk · variants · coverage today. Seams as in Stage Planning § PL-1: 1 customer plugin · 2 customer service · 3 DB-resident PL/SQL · 4 core on the customer line; „flat-layout core edit" means the code sits in a PAS service that on master would be a plugin or PolicyAdministrationSystem/*.
DV-01 — Product process (BPMN + user tasks) for a new or changed product. Ask: the Bulstrad product team via HDesk or Jira (00085986 „нов продукт" → SD-1699; SD-2007 „нов застрахован обект по 3618", Next Release). Evidence: 14 backend commits — c37e140c76 06.07.2026 (3606), 06cf05bf4e 02.09.2026 (3635 + 3606), 71e6418af4 04.09.2026 „Reupload Product 3408", 7a71135a66 05.03.2026 „Product Codes 3443 And 3607 Fix", 2faacd860b 15.09.2025 (2200 / 2222 steps), c0cd227fad 16.07.2025 (a 457-line fork for 3400), 7f0830ed93 renewal post-steps. Placement: seam 1, src/Core/Plugins/Core.Plugin.Bulstrad/Processes (+ SharedProcessServices); on master src/Serdica/Core/__Plugins. Delivery: direct commit → the Core restart uploads the BPMN → prod cherry-pick (8 of 14 on prod); no master port for four of them — „no master counterpart" is the norm here. Verification: start the product's issue process on staging; the Camunda deployment version bumps; a test policy reaches APPROVED. Walk: Hd from Configuration → S1 seam 1, no proposition → S3 Camunda developer → S4 process test → S6 image set + BPMN version → H5 → S9 = re-upload of the previous BPMN version. Variants: new product, step change, „Reupload" (the same file re-deployed), a product-code typo, an environment-specific override. Coverage: C6 (one instance), G24–G27.
DV-02 — Print-document rules and BI Publisher parameters. Ask: the customer via Jira — the best-ticketed shape (19 PRINT tickets in the desk census; SD-593 / 434 / 433, SD-526 / 641, SD-1863, SD-1823). Evidence: 20 backend commits — 2336a6239c 04.06.2025 (CNT_COPY / CNT_DUPLICATE), c25dfc7cb4 29.07.2025, 337dd5ca20 + 2e9b508a0a 01 / 04.08.2025, edc22daf79 ChkCover 22.10.2025, 0561840d4f + 52de8b3721 SD-1863 19 / 21.07.2026; the template-selector series 4412bdf9ef → 6bff307d65 → 07207c3e94 → 7e56082620 (24.10–07.11.2025), a33dec52df / 2f3d2337ac EUR documents; UI aaa4c33d8, dcf0944f2. Placement: seam 2 Integrations/BstPrintDocuments (13 of 20 customer-only) + the shared Operations.PremiumCalculation library (selectors, NuGet) + CFG_PRINT_DOCS rows + POLQRY (seam 3) + BI templates outside git. Delivery: same-day prod (SD-593) or 36 days with a prod-side rewrite (SD-1863); on master 16 of 20, sometimes master-first. Verification: /print-policy on a staging test policy; the per-document printDocs[] log entry (KI-039); the gate fails open (KI-050). Walk: S1 pre-question „configuration row or code?" (CFG_PRINT_DOCS vs selector) → mixed → sub-cases (G28) → S8 = the print on the target. Variants: a new parameter, per-object expansion, a gate, the EUR suffix, bill suppression. Coverage: C2 (the PL/SQL half), C4 (the path fact), C5 (the bundled appsettings); the C# and template half is uncovered.
DV-03 — The reinsurance stream — a customer-funded capability. Ask: the Bulstrad reinsurance department through Ablera's project management; no ticket in 84 commits. Evidence: 84 backend commits, one author, 06.2025 → 08.2026: facultative premium and claims, treaty, natcat, MDP and facultative reports, e-mailed reports, PasReinsurance.Processing.Plugin.CdPrems.Bulstrad touched 35 times, twenty-plus calculation plugins; UI reinsurance area 7 + 2; a prod-only e44c82a407 „Reins calc improvements" 01.09.2026. Placement: the PAS services PasReinsuranceProcessing / PasReinsurers / PasReinsurersIntegrations / PasReinsuranceReporting + Plugins/*.Bulstrad; on master relocated under src/Reinsurance/ (831 .cs); 59 of 84 subjects on master, 66 on prod. Delivery: direct iterative commits („fac premium updates" × 2, „treaty claims updates" × 2, „trigger rebuild" × 4), four appsettings edits, PDF generation touched ten times. Verification: the facultative / MDP Excel report and its e-mail on staging. Walk: does not fit S1's „defect or small extension" — it needs a capability stream case type or an explicit exclusion. Coverage: none; contradicts „never new modules".
DV-04 — A premium or cover computation rule for a product family (2200 / 2222, 2215, 47xx, 36xx). Ask: the customer via Jira or HDesk, often verbal. Evidence: cff3e90e7b „Update the new 4704 requirements" 07.08.2025, af6dc9dd98 2200 / 2222 lrLimit, 8bf32b976c PML layer maximum 21.07.2025, b05b26f32f + f590bf87d7 „Fix IV calc" × 2, fad094dd51 AdjustIVAndDiscountFor2215, 0ba74477c4 preset depreciation factor, 68898c31e8 getRates rounding, 9c81503e62 non-selected cover auto-insertion, 537b754c97 + its revert, 91585166ff policy-level discounts (master port d4e42f1d4b), ae1a15ff58 FORMULA datatype, 9afe740ddf PremTypeTax, bf4a7c31bd „Client complains …"; tickets SD-1442, SD-1703, SD-1964, SD-2063, SD-1550 and the nine PRICING-FIX tickets of the desk census. Placement: mixed — Operations.PremiumCalculation.Bulstrad.Lob{Property,Person,Motor} (seam 1, NuGet) and PasPremium / PasPolicyCrud (a flat-layout core edit). Delivery: direct → prod the same day; master 60 % by subject. Verification: quote a test policy per product; compare with ABACUS and INSIS. Walk: S1 decides per lineage (G19) and records „customer logic in a shared service" as debt; S6 = a NuGet release plus every consumer image (G32). Variants: limit or deductible rule, rounding, factor default, cover auto-insert, discount recording. Coverage: none (C8 is the generic sibling).
DV-05 — Partner registration API hardening (Bul SI, RegisterPolicy). Ask: Ablera's partner programme (/bulsi). Evidence: PasPolicyRegistration touched 21 times; 2dc2c946d6 27.03.2026 „Harden Bulstrad PasPolicy registration flow" (80 files, +6 578 lines, with 20260325_bulstrad_name_change_cust_details.sql), 22d367b8e9 23.07.2026 supplied policy number (master the same day, fea1848b2b), e5c12ffd2a / 7e8e395c35 endpoint rounding, 37a7e083bf 28.08.2025 Bul SI client (IdentityServer Config.cs), 39c4f21b32 flat rate + plugin consolidation (C4), UI 2e26768d5 flat-rate view. Placement: seam 1 PasPolicy/__Plugins/PasPolicy.Plugin.Bulstrad + PasPolicyRegistration + the IdentityServer client — the one area with unit tests (test/PasPolicy.Plugin.Registration.Bulstrad.Tests). Delivery: staging → master the same day, the author porting and naming the source id; prod when the partner goes live (the flat rate is not on prod). Verification: the Postman collection against the staging REST API; register → transfer → print. Coverage: C4 (layout), C1 (mixed seam) in part.
DV-06 — Customer and party data rules (custPid, contacts, names, addresses, LDAP accounts). Ask: the customer via Jira (PARTY 15, ACCESS-USER 26, CUSTOMER-DATA 4 tickets in the desk census) and operations. Evidence: c987780d56 + 5e2ef953d5 custPid 12–13.08.2025 (UI 06448c898 the same day), c80be54c90 + 5d41f24cd8 18.03.2026, 9938af5047 Preferable = Y, 67210f5cf0 SeekCustomerOperation 03.04.2026 (UI 0845c96f0 the same day), 9d9b6ae5f0 + 140a6fc56f LDAP 29.07.2025, 0c0875b60a IdentityServer user accounts; UI 52bbf4059 address optional, 41ab7d18d SD-1943. Placement: PasCustomerCrud / PasPolicyCrud (flat-layout core) + IdentityServer.Plugin.Bulstrad (absent on master) + UI customers. Delivery: UI + backend pairs the same day; master 50 %. Verification: register or edit a test client; INSIS P_PEOPLE after transfer. Coverage: none.
DV-07 — Agent, office and commission code paths (посредник). Ask: the customer (ACCESS-AGENT 9, COMMISSION 6 tickets; SD-1709 fixed in a day; SD-1511 Next Release) and /add-agent operations. Evidence: UI 08fdcf733 „Commissions rework" 30.07.2025 (9 files, −763 lines) + backend efe8ddcfff / ae78919a51 „New Endpoint and Bulstrad plugin for it" (PayablesAndCommissions plugin, 21 files), f0379031fd UR_EXCLUSIVE_AGENTS 20.01.2026, 8e485dcbaf „Fix adding agent office" 20.02.2026, befe3dc639 21.10.2025; UI 943e286b9, 4c9bdd467, d5963e608 / 465d5a5877 SD-1709. Placement: PayablesAndCommissions/Plugins (seam 1 inside a module), PasPolicyCrud, UI participants / agents-comm-defaults. Delivery: the one fix-branch example (SD-1709: staging, prod and master UI the same day; the backend half never on prod). Verification: participant search and the commission default on a test quote. Coverage: none.
DV-08 — A regulatory cross-cutting change: the BGN → EUR changeover. Ask: regulation (euro adoption 01.01.2026), coordinated by Ablera. Evidence: 11 backend + 7 UI commits 07.2025 → 07.2026: 94e9720ff9 „Everywhere BGN -> EUR (or USD)" 07.11.2025 (23 files, DB models), 2f3d2337ac, a33dec52df, 5fa018f789, bd54f9f9b4, 966d7ae74f „bring back ConvertInsuredValuesToBGN" 11.12.2025, riskmodel e580c0d661 VX-46 _EUR template suffix + 835dd31c37 EUR filter (353 lines), 1bfda06407 SD-1962 country-aware rate; UI c899f4ad5 SD-1855, 371d1de5a, GetPremiumAndCurrency × 3 UI + backend 29–31.07.2025. Placement: every seam at once — plugins, shared DB models, riskmodel, print, UI pipes. Delivery: a five-month series with reverts; prod 11 of 11. Verification: quote, print and transfer in EUR and on legacy BGN policies. Coverage: none — a programme, not a case; the multi-placement matrix (G28) at programme scale.
DV-09 — UI number, locale and field-validation behaviour for Bulgarian operators. Ask: the customer via Jira (SD-1950, SD-1971, SD-2138 / 2143 Next Release, KI-037) and UAT. Evidence: 14 locale commits (02.07–11.08.2025: the injection token, toNumberParser, decimal dot and comma, „bringing back previous behaviour"), validators 5fd5aceb2 + 4c837532d ЕГН, 1b71c75d2 bulstat warning, 35e48523e RCertif, 0f3c19120 no-dash, 9ca00e3d9 VIN upper-case; SD-2138 / 2143 (characters vs bytes) still open. Placement: libs/serdica-shared pipes, directives and validators + formly/field-generator.ts — a different path on master (serdica-utils, C3). Delivery: same day on staging, prod and master. Verification: DOM text through handles (G14) on the affected form. Coverage: C3 in part (the path-drift fact).
DV-10 — Product object screens: dialogs, labels, tooltips, descriptions (the 2200 / 2222 wave). Ask: the customer via Jira — seven tickets in six weeks (SD-1839, SD-1855, SD-1857, SD-1869, SD-1953, SD-1968, SD-2138 / 2143). Evidence: 819319152, cb6145ed3, 929df1589, c0dc7192a, c899f4ad5 (all 07.2026, same day as the ticket); the description feature 8b96c4289 15.10.2025 → 63744bf9f + 1e8584276 07.04.2026 → SD-1839 25.06.2026 because it never reached prod. Placement: apps/serdica-ui/src/app/views/business/{quotes,policies,shared} (43 / 39 / 34 touches). Delivery: same day everywhere; the un-promoted feature became a ticket. Verification: open the object dialog on a staging policy. Coverage: none.
DV-11 — Cargo and framework (11xx) contracts: FRAME types, group policies, master-policy objects. Ask: the customer (33 CARGO tickets in the desk census; SD-2005 fixed in three days; SD-1485 / 1502 Next Release). Evidence: 64e5c8fc84 + 51a1da8885 04.09.2026 (32 files: Core.Plugin.Bulstrad 16, WorkflowEngine 4, Ablera.Serdica.Annexes 4) → master 797fdf3bfe the same day; UI 7bf871906 → 98c1616d4; 6a76d8df1 SD-2005; 472059643 / 62cff5a579 pcDescr / ObjDescr 23–26.09.2025. Placement: mixed — plugin + Core WorkflowEngine + the shared Annexes library. Delivery: a two-part series, UI + backend the same day, prod pending. Verification: create a 1102 / 1103 under a 1101 framework; the /sync-framework checklist. Coverage: none.
DV-12 — Motor (47xx) flow rules. Ask: the customer via Jira or HDesk (SD-1862 camper, SD-1919 getPriceByVin timeout KI-012, SD-1987 gadgets, SD-1498 / SD-547 Next Release). Evidence: e7b83d4fb5 + 003b87b1e2 TEMPPLATE 15–16.09.2025, d2a64a2b63 lessee 13.07.2026, 65d353d189 ГФ timeout 18.09.2025 (KI-031), 4a4f950c5a MTPL subtypes (riskmodel), UI 6f339d4de no documents on 4710 / 4711, 6d0f6ff92f. Placement: Core.Plugin.Bulstrad, BstPasPolicyService, PasPolicy.Plugin, riskmodel. Coverage: none; SD-547 has waited since 14.07.2025.
DV-13 — ABACUS pricing pre- and post-filters (Python riskmodel). Ask: Ablera's pricing team and customer tariff asks. Evidence: 15 commits, 33 .py files: 96b300b6d0 4710 post-filter 02.03.2026 (→ SD-1526 rounding 07.04.2026), 1c0cdeaea1 4710 / 4711 12.11.2025; eight by one author (1244cc5785 corrections overrider 21.05.2026, reverted on prod only by 22f9cd9ffe 18.06.2026; region map; EUR filter; default template). Placement: src/Analytics/riskmodel/App — customer-specific by construction, image anl-risk-model; master has 118 .py against 90. Delivery: direct; prod cherry-pick; a prod-only revert. Verification: ABACUS get_rates on staging against the expected premium. Coverage: only as a consult target in C1.
DV-14 — INSIS transfer and revert-to-application handling (C# caller + PL/SQL). Ask: the customer (29 TRANSFER-STUCK tickets). Evidence: 3ec124f482 / 4306d23b1a / a0f3102ea4 INSIS LOCK handling 24.06–02.07.2025, fe37f497be + 00e7828ae5 BstRevert pre-checks moved into the DB procedure 18.07.2025, a68b36b934 bst_integration_sync_to_external_pas 30.01.2026, 65d353d189; the PL/SQL-side tickets of C2's row. Placement: seam 2 BstIntegration / BstPasPolicyService + seam 3 SRD_INTEGR (not in git). Delivery: C# via the branch, PL/SQL by hand on the database — two half-cases. Verification: transfer a test policy; /check-transfer. Coverage: C2 covers the PL/SQL promotion; the C# ↔ PL/SQL split is not covered.
DV-15 — Configurable operator checks and messages with DB rows. Ask: the customer via HDesk (00104150 anti-backdating 4704, 00103979 3636 start date, 00099893 — all 07–08.2026, after the generic commit). Evidence: c6e39ad5d6 17.07.2026 (+ 20260717_policy_date_operations_messages.sql), b26c4f3657 UPR (two .sql), 003b87b1e2, 1d2fb215ed, a5eaf1d903 + b1507c3b34 human-readable error arguments, 8f57105189, 4d0c87d902, d4dfadb1a5. Placement: the shared Ablera.Serdica.Operations.* NuGet + SR_MESSAGES and configuration rows; only 3 of 300 commits carry .sql — the rest of the DB side is applied outside git. Delivery: library release + consumer rebuild (G32); prod the same day. Verification: trigger the check on a staging quote; the message text in Bulgarian. Coverage: C8 / G32 in part.
DV-16 — Incident-driven robustness fix (clamp, index, error leak). Ask: operations (a KI). Evidence: d7f8c72210 KI-044 → master a44b7e21c8 eleven days later, UI d2ec130b4 + fix/configuration-paging-collector; 0135c051c1 05.11.2025 and e8203dd01b 03.08.2026 numeric casts and index seek, 500dd218e0, 507568d56b chunks, a8838a2c1d; 054e4c1347 / 6d0f6ff92f operation-runner error leaks. Placement: shared libraries (CrudBaseServices, Operations.Runner) → NuGet + all consumers. Coverage: C7 / C8 — adequate.
DV-17 — Branch reconciliation and merge-from-master ports (flat-layout upkeep). Ask: nobody — the lineage forces it. Evidence: the 15.07.2025 series of ten prod → staging commits (fe12495778 … 4b993d3d43); master → staging 9e003a3056 / 05dd255502 / 05eb772fbf 13.06.2025, 6bff307d65 04.11.2025, d06220cbb7 „Equalize with master", 5ca7faf71c 18.02.2026, UI 229bfca3f; UI be8c611d7 „backport from production"; prod-only e80cb39847; the UI history rewrite of 04.09.2026. 27 of 300 backend commits (9 %) are branch plumbing. Coverage: C4 / G17 / G18 describe one direction; reconciliation from prod and merges from master are absent.
DV-18 — Pipeline, registry, dependency and tooling maintenance on the customer branch. Evidence: CI 12 (three on 29.07.2025; the GitLab server move 08–09.02.2026; 35bcd3d14c the staging environment 22.10.2025; 21c2545cc0 BOM; trigger rebuild × 5), DEPENDENCY 4 (33d4a6ed49 .NET 10, d4daeceb75 AutoMapper 15.1.1, ddaed4889e CVE-2026-48109, a5d6af3298 Maven / JRE), TOOLING 3 + 5 (.claude/ rewrite 13–14.04.2026), UI package-lock 7, GraphQL schema regeneration 3. Placement: .gitlab-ci, Dockerfiles, csproj / package.json. Coverage: G23 / D130 only.
DV-19 — appsettings.json as code. Evidence: 34 commits bundle it, 6 are appsettings-only (8e89216d9b, 8ce2e2c2d5, 5a4c676b97, 4a2700a551, 2070e6e60d a RabbitMQ route, c557103374 „appsettings.json reset"). Coverage: C5 — adequate as written; add the „reset" pattern (a developer reverting local values).
Census challenges
What the real changes ask of the module page and its stage pages. Each is a challenge to a written rule, with the rule the changes suggest; the design disposition is recorded below.
- Census finding The estate's fix rule exists and is not practised.
code-changes.mdis on all four origin refs of both repositories and prescribesfix/SD-XXX→ MR tobulstrad-staging→ deploy → cherry-pick prod → cherry-pick master (mandatory). Reality: direct commits to the environment branch, no MR merge in 15 merges, two SD-named branches in the estate. Suggested rule: Stage Test and Corrections states that the S5 merge request (G7) is a practice the module introduces, not one it inherits — and the ledger records the first hundred cases that follow it. - Census finding A case is a series, not a commit. Seventeen duplicate subjects,
part #2,Reupload,Reapply, 18 reverts (a same-day revert and re-add of the payment-plan calculator on 22–23.05.2026), five emptytrigger rebuildcommits. Suggested rule: S3 and S6 accept n commits per case and a revert as a normal step of the series, not only as S9. - Census finding Most work has no ticket. 92–97 % of commits carry no SD id; asks come via HDesk (77 mapped, e.g. 00104150 → SD-2125), verbally, or as Ablera streams. Suggested rule: S1's brief has an origin „no ticket — the ask is recorded as …", and the Next Release queue (eight tickets without a commit, the oldest since 14.07.2025) is an intake the module reads.
- Census finding Ports run in five directions and PROD has its own commits. master → staging (9), prod → staging (10), staging → master (171 by subject, 11 explicit, 0 by id), staging → prod (52 prod-only re-applications since 21.01.2026), prod-only work (
f7c6fba83a,e44c82a407). Stage Deployment Scripts covers one direction. Suggested rule: the branch memory node records all five and the same-day master ports an author makes himself; a pinned branch set is a commit id, and a non-fast-forward move of a protected ref (UI, 04.09.2026) is a case event. - Census finding Deployment is nominal on staging. PROD receives UI fixes the same day as staging in 9 of 9 measured tickets and backend fixes in 4 of 6; the deploy is a manual Ansible job whose Bulstrad targets are not in the repository. Suggested rule: Stage Deploy and Reversal says plainly that H5 is the first real gate this estate has had, and names the
serdica-infrastructurejob as the executor's target (D130). - Census finding UI and backend ship together. At least ten same-day pairs (FRAME 04.09.2026, flat rate 27.08, SD-1709 22.05, product 3606 06.07, SeekCustomer 03.04.2026, commissions 29–30.07.2025, custPid 12–13.08, pcDescr 23–26.09.2025, the clamp 19 / 30.08.2026). The contract paper (G5) is right; the order is not always UI after backend (the commissions rework was UI-led). Suggested rule: the deploy order is a field of the brief, not a default.
- Census finding DB rows the code expects live outside git. Three commits carry
.sql(four files);SR_MESSAGES,CFG_PRINT_DOCSandPOLQRYbodies are applied by hand. Suggested rule: S6's release set lists „DB rows expected by this build" even when no script exists, and the Configuration module owns them when they are product rows. - Census finding Product logic sits in shared services on the flat layout. 150 PAS-service touches against 88 plugin touches; 39 mixed commits; on master those services are doc-only stubs. Suggested rule: the placement analyst reads placement per lineage (G19) and records „customer rule in a shared service" as accepted debt — otherwise DV-04, DV-06, DV-07 and DV-11 all become propositions and nothing ships.
- Census finding Authorship is concentrated. The support lead writes 52 % of backend and 48 % of UI commits on the customer line; the „estate development lead" who receives propositions is, today, the same person. Suggested rule: D108's return path allows „same actor" without a GitLab issue.
- Census finding Reinsurance is 28 % of the line and a module. Suggested rule: either Non-Goals excludes it by name, or the module gains a capability stream case type with its own cadence — iterative commits, reports as verification.
- Census finding Committed generated artefacts (GraphQL schema × 3,
package-lock× 7,.claude/× 8) reach the reviewer as changes. Suggested rule: the reviewer checklist (G6) flags them as not-for-review.
Sizing facts the estate should keep F. Backend 18.8 and UI 8.4 commits a month; ticket-traceable 3–8 %; customer-specific by path 43 % of backend commits; on prod 74 % / 93 %; on master 57 % / 68 % by subject and 0 by id; ticket → staging commit 0–1 day in 11 of 13 pairs.
Architecture disposition — 07.09.2026
P The case journeys and wire/protocol specification answer the census questions without expanding the module charter. The interactive walkthrough traces every case on this page through requests, records, prompts, messages, gates, execution, reversal and next-request learning. These are design decisions and offline acceptance criteria, not proof of deployed behaviour.
| Census question | Design disposition |
|---|---|
| Direct commits versus reviewed MR practice | The module enforces the intended reviewed-MR path; historical direct commits are evidence of the gap, not inherited permission. |
| Series, reverts and paired components | One case keeps the whole commit series and an explicit compatibility-ordered release graph, including database rows, packages, consumers and external templates. |
| Un-ticketed requests and Next Release | Record verbal/internal asks through authorised intake. Support owns the waiting queue and recruits Development when the stored trigger fires. |
| Ports and rewritten refs | Pin both heads, preserve target-only work and prove semantic equivalence in the requested direction. Ref rewrites invalidate affected evidence. |
| Deployment outside the source repo | The existing infrastructure job remains the target executor; job result, serving versions and customer-surface proof are separate required observations. |
| Flat-layout placement and concentrated authorship | Placement is per lineage; shared/core impact still requires its existing decision. One person may hold roles, but same authorship does not bypass them. |
| Programme-scale reinsurance/currency | Explicit referral and accountable owner under N-8. Bounded implementation requests can use the current module; no capability-stream feature is added. |
| Generated artefacts | Reject the suggestion to exclude them from review. Lockfiles, generated contracts and tooling instructions may affect behaviour; review relevant semantic changes and regeneration. |