☰ Contents
AISA v2.0 / Technical documentation / Challenge rounds — 02.09.2026

Challenge rounds — 02.09.2026

F verified factP decided planC open challenge

The record of how the wiki's open items were worked down on 02.09.2026, in three passes, and what each pass left. Every settled conclusion is now a numbered decision in the decision register or a P statement on the design page that owns it; this page keeps the reasoning, the measurements and the items still open, because nothing else does.

§ The pass What it produced What is left
GA the goals completeness audit — five goal areas against twelve dimensions 30 gaps, 12 contradictions, six undefined terms all 30 gaps landed as goal statements and all 12 contradictions are resolved; one term is still undefined
CS round 1 — a designed answer, and the event that would confirm it, for all 63 class B, C and D register rows 60 settled one still open — the source/intentgpt domain. Three were open on 02.09.2026: the production-simulation criteria were settled by D107 and D127, and the network request to Bulstrad IT by D128 and D132
R2 round 2 — the rows no earlier pass had investigated, plus the rows whose pointer named a solution that did not address them ten designed answers and their measurements, each now carried by a design page the measurements that confirm them, and one grep

Section ids are stable§ GA-3, § CS-2.2, § R2-9. The CH ids inside the sections are the register ids of 02.09.2026 and do not resolve against today's Challenges Register, which had been regenerated twice by 02.09.2026 and several times since; each section names the page that carries its conclusion instead. The decisions still waiting for a person are on Open Decisions, which is the page to decide from.


GA. The goals completeness audit

What this was. A read-only audit of 00 Goals/*, Home.md, the Requirements Register and the Glossary, with the architecture pages skimmed for behaviour they implemented that no goal stated. Method: for each of the five goal areas, twelve dimensions marked present / partial / missing, with the statement ids that carried them. "Arch only" counted as a gap, because the Requirements Register and the Metrics page are built from the goals, not from the architecture. It is the record the Requirements Register's G-16 cites.

Where its conclusions went. The audit produced 30 gaps, 12 contradictions, an orphan list and six undefined terms. All 30 gaps landed as goal statements — Platform PG-9…PG-22, Configuration CG-10…CG-13, Support SG-10…SG-14, Source DG-7…DG-9, and the three proposed non-goals as N-9…N-11 (of which N-9 was later withdrawn by D81 and replaced by N-12). All 12 contradictions are resolved (§ GA-3). Of the six undefined terms, five are now Glossary entries; one is not (§ GA-4).

One dimension was later redefined. The audit marked Economics against a cost-per-ticket target. D52 and D79 removed money as a metric of this platform: no figure on any page is expressed in currency, and the valid measures are hours, bus factor, people involved, knowledge domains involved, elapsed time and vendor dependency removed. The Economics marks below are therefore a record of what was audited on 02.09.2026, not of what is measured now.


GA-1 The twelve-dimension matrix, as marked on 02.09.2026

P present · p partial · M missing (behaviour existed in the architecture, no goal stated it). P/p = present for the module, partial in one respect.

# Dimension Platform Configuration Support Source Cross-cutting Closed by
1 Actors p p p p p PG-11 (the five roles, approval as a permission); the customer's own role — Customer representative — is in the Glossary and CG-11
2 Inputs p P P/p p P PG-10 (authority from grants, never from content); intake per module
3 Outputs p P P P/p P PG-6 extended (the write log keeps the statement); PG-13
4 Lifecycle p p p p p PG-9 (a case survives worker, connector and provider loss), SG-13 (cancel), PG-13 (retention)
5 Decision points p P/p P/p P P PG-12 (escalation with no available holder), CG-11 (the customer's acceptance), CG-12 (STAGING gated like production)
6 Failure modes M (arch) p p p p PG-9, PG-18 (kill switch, soft and hard), PG-21 (simulate before promotion)
7 Boundaries p p P P P/p N-9…N-11 as proposed; N-9 then withdrawn and replaced by N-12 — no autonomy the platform granted itself (D81)
8 Measures p p P/p p P CG-13 (specification quality), DG-9 (placement measured), SG-12 and SG-14 metric rows
9 Data & security p P P/p p p PG-13 (handles, re-identification as an audited action, retention per class)
10 Economics p p P p P Redefined by D52 and D79 — hours, bus factor, people, domains, elapsed time, vendor dependency; PG-16 keeps budgets as a control
11 Evolution M (arch) p P P p PG-14 (owned, versioned, tested, revertible), PG-15 (eval sets re-run)
12 Logic see § GA-3 see § GA-3 see § GA-3 see § GA-3 see § GA-3 the twelve contradictions, all resolved

GA-2 The scenario walk — ten scenarios, and what each exposed

Each scenario was walked against the goals only. Nine came back partial and one missing; every uncovered step became a gap in the list above.

# Scenario What it exposed Closed by
i A product owner e-mails a tariff workbook for a new travel product no commercial position before H1; no customer at H1; no customer acceptance before H5 CG-10, CG-11
ii PROD data fix requested 17:55 Friday, the only approver away no escalation, timeout or delegation rule; the SLA clock runs while the platform is business-hours only PG-12; SG-5 now names the contract's business-hours calendar
iii Two operators open the same policy's ticket from Jira and from HelpDesk dedup and controller collision were architecture only PG-20, SG-10
iv Mid-case the request turns out to be a CR under § 2 reclassification: which clock restarts, what the packet is, who receives it SG-12; the commercial counterpart is a Glossary term and a plug-in value
v A model provider is down for a day no goal on degraded operation PG-9
vi A memory article is wrong after 20 cases relied on it no review of the cases that pinned it SG-14
vii "Who approved this UPDATE on 12.06 and why" after case close the handle rule made the object unresolvable from the ledger PG-6 extended and PG-13: the ledger keeps handles, the write log keeps the statement
viii An operator leaves the company missing entirely — no offboarding of sessions, ownerships, held batches or grants PG-19
ix The platform must be switched off in an emergency only a soft stop was defined PG-18 (hard mode)
x A v1 skill and a v2 skill both exist for one operation write ownership per target had no register and no enforcement Delivery § 3 extended; later simplified by D64 — v1 is the migration source, not a coexistence peer, and the write register is removed

GA-3 The twelve contradictions, and how each was resolved

# The contradiction Resolution
C-1 PG-5 promised "sub-agent thoughts"; the architecture promised "stated reasoning, not raw chain-of-thought" PG-5 now reads stated reasoning for a step (not raw chain-of-thought)
C-2 The gate table fired H5 at protocol phase 9; the module put H5 at phase 8b Gating § 1 states H5 at phase 8b and holds the whole gate set on one page (D88)
C-3 Metrics pinned the deployment-set decision to H2; the module chose it at intake Metrics pins it to the plan revision that set it
C-4 "Every write stays human-gated" against "write execution is configurable" "Protected target" is defined in the Glossary and enumerated in SG-6; the working environment is explicitly not protected. D72 then classified every write into seven classes, of which only two may ever auto-confirm
C-5 The ledger stores handles that die with the case; the write log must stay readable years later Split by store: the ledger keeps handles, the write log keeps the statement actually sent (PG-13). The handle map is encrypted per case and crypto-shredded at close (§ R2-5)
C-6 SLA clocks against "availability: business hours, Sofia" SG-5 names the contract's own calendar (Bulstrad § 1.6.2, Mon–Fri 09:00–18:00 excluding holidays) as a plug-in value
C-7 The platform's "deployer" deploys, against "deploy is a manual job by Ablera DevOps" DG-8: deployment is executed by the estate's mechanism from the platform's approved packet; the platform prepares, requests, records and verifies
C-8 "the mined effort distribution of 485 tickets: 40 · 116 · 137 · 37" — those four sum to 330 Corrected: the distribution is over the 330 tickets that carry an analysis; 155 of the 485 have no analysis and no class
C-9 "one controller per session" against "one control session per case" PG-3 reads many read viewers + exactly one control session; Agent Runtime defines a session as one live execution of a case
C-10 A "page" in serdica-ui administration against a seven-screen section PG-5 reads a dedicated section. D91 then made the UI two surfaces — seven operator screens and four client screens
C-11 Support's default target is PROD, while routing from the QA host to PROD was unverified Stated as a dependency, not a contradiction. The probe is still outstanding — six reach rows in the Challenges Register against Software Architecture — and D46 makes the answer a CONNECTOR_SCOPES row rather than a design change
C-12 The Requirements Register and the Details pages were not a superset of the goal tables The module rows were added and the Details pages gained the missing sections

GA-4 What the audit flagged that is still not closed


CS. Round 1 — design proposals for the B, C and D rows

What this was. On 02.09.2026 every class B (decision), C (deferred by design) and D (build item) row of the then-current Challenges Register — 63 rows — was given a designed answer and the event that would confirm it, rather than being left as "decide later". The register held 64 such rows at the time; CH-75 went to the repository agent instead (Measurements § RE-6).

Where the conclusions went. Sixty of the 63 are settled: as a numbered decision in the decision register, as a P statement on the design page named in § CS-1, or withdrawn because a later decision removed the work. Three were still open on 02.09.2026 and are kept in full in § CS-2, because the register still pointed at them and no other page carried their text: the source/intentgpt domain, the production-simulation criteria, and the network request to Bulstrad IT. One is still open today — the source/intentgpt domain; CS-2.2 was settled by D107 and D127, CS-2.3 by D128 and D132. The register itself was regenerated after this work and carried 12 rows with different ids at that point; the CH numbers below are the ids as they stood on 02.09.2026 and do not resolve against today's register.

Money removed (D79). The verifier-tier proposal (CH-03 / CH-37) set its keep-or-narrow rule as a multiple of a per-ticket currency figure. The figure and the multiple are struck; the tier structure survives on Metrics and Stage Investigation, and the measure is disagreements and retractions per tier.


CS-1 The 60 settled rows — where each conclusion went

Pages are named as they are today; the pages these rows were written against were renamed and merged on 03.09.2026 (D88, D94, D96).

CH Subject Where its conclusion went
CH-01 the whitelabel field catalogue v1: schema semantic versioning + a three-export gap pass Stage Normalization (with CH-22, CH-27)
CH-02 backup ownership and the backup inventory D45 — DBA process plus a 15-minute off-database export; Software Architecture
CH-03 verification overhead — the tiered isolated verifier Metrics, Stage Investigation (with CH-37); its currency rule struck by D79
CH-04 route-selection predicates Platform Details PG-7
CH-06 triaging ~150 v1 feedback files — the mechanic / skill / article / experience decision table Agents Memory (with CH-36)
CH-08 the configuration summary has no serialisation Stage Abacus § SUM-*
CH-09 the summary is v0, drafted from code Stage Abacus — kept as the first-slice measurement
CH-15 a bundle rate does not tell the split — the bundle_split blocking question Stage Normalization
CH-16 rating may need a minimal IPAL catalogue first — the S3 pre-pass Configuration Module; re-decided by D75 (the tariff phase is first and is the first writer)
CH-18 filter knowledge is thin — filters are Hd, the contract is a summary entry Stage Abacus, Agents Memory
CH-19 loop-back semantics — amend the plan revision, never replan Configuration Module § 7 (Measurements § RE-12)
CH-20 lifecycle scope per assignment — meta.lifecycle as a specification field Stage Normalization
CH-21 the INSIS-side teardown checklist and the transfer specification section Withdrawn by D85 — the INSIS side is one PL/SQL script per product: no sub-stage, no teardown checklist, and no transferred rung to prove (Stage IPAL)
CH-22 the field catalogue, stated again on the normalization stage see CH-01
CH-23 who owns a "visible only to group X" wish — offer segmentation or a role-gated route Stage Offer
CH-24 rule-combination testing — specified rules, pairwise sampling, 25 seeded selections Stage Offer
CH-26 where the whitelabel renderer runs Settled the other way by D40: the renderer is a skill, not the platform service this page proposed
CH-27 the field catalogue itself see CH-01
CH-28 INSIS-transferring products carry a second structure see CH-21 (withdrawn, D85); the schema work is § R2-8
CH-30 intentgpt seams unmapped see § CS-2.1 — open
CH-31 replaying the customer's surface — test identities, not impersonation Stage Application and Verification; the application side is § R2-3
CH-32 batch preflight cost — cheap preflight, 10 % / minimum 3 sampling Stage Application and Verification
CH-33 symptom-signature extraction — the two-layer signature Stage Classification
CH-34 personal data enters at classification — CASE_HANDLES Trust and Data; encryption shape in § R2-5
CH-35 which investigator leads a cross-system symptom Stage Investigation; replaced by the two-phase lead of § R2-6
CH-36 the mechanics catalogue is larger than seven see CH-06
CH-37 cost of the isolated verifier see CH-03
CH-38 article proliferation — the index cap and measured passes Stage Precipitation
CH-40 memory staleness — the verify block per article Stage Solution Take, Agents Memory (with CH-68)
CH-41 administration UI visual design UI; superseded in scope by D91, D99 and D119 — two surfaces, eighteen generated wireframes (chat-first case workspace)
CH-42 transcript volume — reference payload, 10/s, pages of 200 UI
CH-43 summarizer depth and refresh Agents § 0
CH-44 profile inheritance D50 — whole profiles; a module default is an authoring template only. Framework versioning is § R2-4
CH-45 build on Microsoft Agent Framework or from scratch D39 — the provider abstraction is copied and owned; no MAF unless it demonstrably saves work
CH-46 compaction quality Agent Runtime; consult latency is § R2-2
CH-48 worker scheduling — a pool with fenced leases Agent Runtime
CH-51 the D-P2 wording D41 — accepted as written
CH-52 a restore is a ledger event Architecture
CH-53 the Runtime heading tagged C Architecture — retagged
CH-56 the OpenTelemetry sink Software Architecture (with CH-65); D78 names Prometheus as the metrics-sink candidate and makes the choice an operations decision
CH-60 SRD_SUPPORT in the QA backup inventory see CH-02
CH-61 · CH-62 egress; routing to STAGING and PROD see § CS-2.3 — open
CH-65 the OpenTelemetry sink see CH-56
CH-67 granularity for multi-ticket sagas — saga entries anchored on the known-issue id Agents Memory
CH-68 article staleness see CH-40
CH-70 the v1 archives: link or extract Agents Memory — linked in place
CH-71 eval-set cost — pre-publish, nightly dirty domains, weekly corpus Agent Framework § 6
CH-72 name, source, or nothing, confirmed per project Agent Framework § 6, Software Architecture § 9
CH-73 · CH-74 the Azure OpenAI adapter versus MAF see CH-45 (D39)
CH-75 the RabbitMQ.Client delta D48 — copied as libraries (Measurements § RE-6)
CH-76 effort classes are inferred, not recorded Agents Memory and Skills § 2 — kept as a caveat
CH-77 bus-factor holders D43 — measured from the Jira Internal Tag (Agents Memory and Skills)
CH-79 free-text PII detection — the three-layer detector Trust and Data
CH-80 a stable pseudonym in the experience index D44 — no stable person pseudonym; a keyed hash for business objects only
CH-81 the effect inventory for simulation — effects[] Failure and Recovery
CH-83 trust labelling through sub-agents — structural labels, lowest class wins Trust and Data
CH-84 grant lifetime and invalidation — 4 h write / 7 d read, precondition query Trust and Data § 2
CH-85 re-verifying DB-shaped statements — the 90-day stale-F report Requirements Register § Sources

CS-2 Still open

CS-2.1 The source/intentgpt domain (CH-05, with CH-30 and CH-49)

Proposed solution P. The node is stubbed now and deepened on the first case, and repository access is a prerequisite of the Support/Source wave, not a first-case task. The stub source/intentgpt/AGENTS.md is written by hand from what the estate already knows: the Beth anatomy (master prompt → line-of-business → minibot per operation; SRD_INTEGR.BETH_OPERATIONS_FILES), the health-AI retirement manifest on the branch (which behaviours move to native C#), and the placement rule below. Before that wave the intentgpt repository is added to the GitLab connector scope with a project access token so a worktree can be taken; if the repository cannot be reached, the case opens with a MISSING entry and the summarizer works from the retirement dossiers alone. Placement rule for intentgpt: because the component is being retired, the default placement is the smallest patch that removes the symptom; any extension produces a core-change proposition routed to development, with the note that the health path is replaced by the AI program. The seam map — which files hold intents, minibot prompts, the Serdica calls — is the summarizer's first output and becomes the node's § 1.

Alternatives rejected. Building the node only when a case arrives (the case then pays for access negotiation). Reading the repository now in full (it is being retired; the summarizer's index depth is enough).

Closes when. The first Source case touching intentgpt boots from a node that already exists and adds its seam map; the repository was reachable at case open. Owner: source author; access request: platform team.

Where it is carried. Source Details DG-3 and Agents Memory § 4 keep one C each — "seams unmapped until the first case" — as the confirming event. Source Module § 5 records that the eight real changes cover no intentgpt case for the same reason.

CS-2.2 Production-simulation criteria and the H5-SIM gate (CH-54)

Superseded, 04.09.2026 (D107, D127). H5-SIM is held by two roles, not two named people — Approver(PROD, simulation) granted to Ablera support lead and Bulstrad system owner, who holds a role being onboarding data in the customer plug-in (D107). The countersignature ask is replaced by a data-administration agreement signed by operator and client, of which the five criteria (D42) and the two-role gate are clauses (D127). The text below is kept as the record of the reasoning — see Failure and Recovery § 5 for the state in force.

Proposed solution P — the text to put to Bulstrad. Exception criteria, all of which must hold: (1) the evidence cannot be obtained on any non-production target, shown by a recorded attempt or a data-dependency argument in the plan; (2) every step's effect class is transactional, or compensable with a compensation already written; (3) the blast radius is one policy, one product version, or one account; (4) the pre-state is captured as evidence before the first write; (5) reconciliation is verified the same business day, and the reconciliation query is in the plan.

Approver set. The gate is a distinct kind, H5-SIM, whose role Approver(PROD, simulation) is held by two named people — the Ablera support lead and a named Bulstrad owner (IT or business, per system) — and, as the organisation's role-set choice under D34, the platform is configured so that the role is not held by any operator, which makes it a two-holder gate without a platform-wide four-eyes rule. The record names both holders.

Alternatives rejected. No production simulation ever (some transfer defects reproduce only against production INSIS state). A platform-enforced four-eyes rule (contradicts D34; the same effect comes from role configuration).

The doubt in the proposal, as recorded on 02.09.2026. H5-SIM achieves four eyes by role configuration to stay inside D34, but it is a platform-defined gate kind whose whole purpose is to require two people; if Bulstrad reads that as a four-eyes rule imposed by the platform, the proposal contradicts the decision it claims to respect.

Closes when. The criteria and the two names are written down and signed off by Bulstrad, and the H5-SIM gate kind is configured. Owner: Vladimir + Bulstrad. Carried as C on Failure and Recovery § 5; the gate kind is in Gating § 1 (D42).

CS-2.3 Internet egress and database routing from the Bulstrad QA host (CH-59, with CH-61 and CH-62)

Superseded in part, 04.09.2026 (D128, D132). Reachability follows the customer's policies, so this is a rolling process rather than one request: every new reach is a specific, defendable request and its answer changes CONNECTOR_SCOPES rows, never code (D128). “Topology B” is dead: there is no tunnel and no Ablera-side model gateway — model calls go directly to the provider's EU endpoint, and an unreachable target parks the case on a capability gap (D132). The request text below is kept as the record of what was asked — see Software Architecture § 10.3 for the state in force.

One request to Bulstrad IT covers both, with a fallback per part.

The request to send (to Bulstrad IT, copy Ablera DevOps):

Subject: Network access for the Serdica AI Support service on the QA host serdicaqa.bulstrad.bg (10.239.82.105) The new compose unit serdica-ai-support on the QA host needs the following outbound connectivity. Please grant or state which items are refused. A. Internet, TCP 443: <resource>.openai.azure.com (Azure OpenAI, EU region — Sweden Central or West Europe; the exact resource name follows with the provisioning), login.microsoftonline.com, graph.microsoft.com, ablera.atlassian.net, api.atlassian.com, gitlab.ablera.dev, bulstrad-registry.ablera.dev, vault.ablera.dev. B. Bulstrad network: hdesk.bulstrad.bg TCP 443; Kibana 10.239.82.110 TCP 80; the ABACUS gateway per environment (ports as deployed). C. Database routing from 10.239.82.105: TCP 1521 to 10.239.82.122 (STAGING IPAL) and 10.239.82.109 (PROD IPAL); TCP 1522 to 10.239.82.123 (STAGING INSIS); TCP 1521 to 10.239.82.103 (PROD INSIS). The service authenticates to Azure OpenAI with an Entra identity, keeps customer data on the Bulstrad network until the EU-resident provider under the existing DPA, and holds no inbound ports beyond the nginx location already on the host. A connectivity probe (curl -sI per FQDN, tnsping per database) will be run from the host after the change and its output filed.

Fallback if A is refused — topology B: an Ablera-hosted model gateway over the VPN holds the provider keys and the EU endpoint; the Jira, mail and GitLab connectors run on the Ablera side as the v1 CLIs do today, recorded per connector in CONNECTOR_SCOPES; the path is named in the DPA record.

Fallback if C is refused — per-environment connector hosts: a small container running only the Oracle connector library, behind mTLS, on the STAGING (.112) and PROD compose hosts, called by the QA platform over whatever route exists between the compose hosts; if no such route exists either, the Oracle connector for that environment runs on the Ablera side over the VPN and the case's grant records that path. In every fallback the grant model, the ledger and the handle boundary are unchanged — only the connector's address book moves.

The doubt in the fallback, as recorded on 02.09.2026. "A connector host on the STAGING and PROD compose hosts" assumes those hosts can be reached from the QA host at all and that Ablera DevOps may place a container there; both are the same unknown the challenge names, one layer down.

Alternatives rejected. Deploying the platform on STAGING or PROD (old source layout). Waiting for the answer before the first wave (wave 1 runs on QA-internal reach; the answer gates the customer-environment work).

Closes when. The probe output from the QA host is filed as F on Software Architecture § 3, or the topology-B / connector-host decision is recorded as a dated P. Owner: Bulstrad IT (answer), platform team (probe). The reach rows themselves are data, not code (D46), so the answer changes CONNECTOR_SCOPES rows — see § R2-9.


R2. Round 2 — the rows nobody had investigated

What this was. The second challenge round of 02.09.2026: the register rows that no earlier pass had investigated — those whose "Investigation / proposed solution" column was empty (CH-10, CH-14, CH-15, CH-31, CH-46, CH-57, CH-81) and those whose pointer named a solution that did not address them. Read first, not repeated: § CS, Measurements § RE, Measurements § DB. Citations: path:line in the workspace, page § section in the wiki, and SELECT-only queries run that day (connections BST-PROD-IPAL-SRD_INTEGR, BST-PROD-INSIS-ABLERA_SUPPORT; both disconnected after use). Verdicts: F fact · P proposal · C still open, with what is missing.

Why it is still here. Eleven design pages cite a section of this report as the source of a F or a P. Each section below ends in Applied in, naming the page that now carries its conclusion; the page names are today's, not those of 02.09.2026 (D88, D94, D96). Two sections are superseded: § R2-7 (the S3b sub-stage) is withdrawn by D85, and the pointer-correction lists of the original §§ 11–13 were applied to challenges_triage.csv and the register regenerated — what survives them is in § R2-11. The register's CH ids below are the ids as they stood on 02.09.2026 and do not resolve against the twelve-row register that followed that regeneration, nor against today's.

Decisions in force when it was written: D39–D50 of the decision register — no Microsoft Agent Framework dependency unless it demonstrably saves work, the whitelabel renderer is a skill, one schema SRD_SUPPORT, the health branch's RabbitMQ libraries copied as libraries, reach as a platform capability through a tunnel connector, retention configuration with default "never expires", approval as a permission, POL only.


R2-1 CH-81 · Agent Skills — the HDesk and mail streams, counted

Challenge. The HDesk and mail streams (VIN corrections, framework onboarding) are under-counted; a title-level pass over hdesk/ and emails/ corrects the counts before the first Support eval set.

What I did. Read every hdesk/*/metadata.json (subject, queue, state; 52 folders), hdesk/_jira_map.json (77 OTRS→Jira mappings), hdesk/_history.json (13 status runs, last 19.06.2026), and the 38 ### Thread headings of emails/THREADS.md; classified each item into an Agents Memory and Skills § 9 shape, "Configuration-module intake" (a product change with no support skill shape), or "reference".

Finding F.

What the two archives actually are. hdesk/ is the OTRS queue "Ablera" — every one of the 52 cached tickets has queue = Ablera; states: очаква доработка 29 · обработва се 9 · нов 9 · затворен 3 · очаква потвърждение 2. It is the customer's product-change and CR queue, not the support stream. The OTRS support stream (VIN corrections, куха полица, ИП office onboarding) never enters hdesk/; it reaches the workspace as notification e-mails („Уведомление за нов билет", „Актуализация по резервиран билет") archived in emails/ — 30 of the 38 threads are OTRS-born and HelpDesk-only (no Jira ticket). The cache is also partial: _jira_map.json maps 77 OTRS tickets to Jira keys while only 52 are cached, and the last status run (19.06.2026) counted 32 on the dashboard against 40 in the cache.

Classification — HDesk "Ablera" queue (52).

Shape n Tickets
Configuration-module intake — product change, new product, clause, tariff, check, promo, questionnaire, visibility 39 00000075 (4704 задание), 00057910, 00061034, 00065573, 00071976, 00072908 (3607 покрития), 00076893 (обект 1123), 00076960 (IMO field 1100/1102), 00080589, 00081163 (отстъпка 3618/3636), 00081768 (3613 >20 %), 00081964/00081965 (3602 мин. премия), 00085986 (нов продукт), 00087147 (3602 клауза 4), 00093901 (ИНСИС/МАТРИЦА), 00097807 (3607, CS-3), 00097862 (Общинска банка), 00098069 („Пълна защита"), 00098632 (4710 control), 00098747 (промо 65, CS-4), 00099115 (Портал visibility), 00099893 (дата на издаване), 00100006/00101783 (4727), 00100873 (2200/2222), 00101281 (промо 65 follow-up), 00101359 (3304 регистрация), 00102031 (въпросник 3602), 00102052 (3607 краткосрочна), 00102452 (HSSC карго, CS-6), 00103956 (3602 подлимит), 00103973 (3618 тарифа), 00103974 (3636 тарифа), 00103979 (3636 начална дата), 00104001 (лимит), 00104150 (антидатиране 4704), 00104195 (3636 клауза), 00104411 (Гуми 4727, CS-7c)
#5 discount / loading / deductible fix on a policy 2 00092847, 00098744
#7 sync compare + fix (куха полица) 3 00101947, 00101951, 00100274
#12 getRates / pricing check (defect) 3 00092950, 00095904, 00103259
#26 pricing-factor / LOV / nomenclature add 3 00080821 (групи стоки Cargo), 00090023 (НКИД), 00081358 (предмет на дейност)
#14/#16 motor — locked chassis 1 00080729
#23 cargo text-field correction (1100 „дата на падеж") 1 00102569

Classification — emails/THREADS.md (38).

Shape n Threads
#16 VIN / reg-no / vehicle correction 12 1.6, 1.8, 1.9b (DKN), 1.12, 1.22, 1.23 (P2777KP), 1.24, 1.25, 1.30, 1.31, 1.35, 1.36
#7 sync compare + fix (куха, документ dates, crossed mapping) 7 1.17, 1.18, 1.20, 1.27 (↔ SD-1882), 1.28, 1.29, 1.33
#8 agent / broker / office setup (ИП) 4 1.21 (18518), 1.26 (17254), 1.37 (17313), 1.38 (17614)
#2 retransfer / stuck transfer / correction of application 3 1.10, 1.11, 1.15
#12 pricing check (завишение) 3 1.7, 1.14, 1.16
#14 duplicate policy / ЕИСОУКР 2 1.5, 1.19
Configuration-module intake 3 1.13 (промо 65 spec, ↔ SD-1524), 1.23b (My Bulstrad 3636 templates), 1.34 (Общинска банка PROD deploy, ↔ SD-1443)
#31 BSO (sticker replacement) 1 2
#4 Kibana / postmortem trace 1 1.9 (abc_prem)
#9/#27 ownership + customer data (2214) 1 1.32
reference, not a case 1 1 (ЕИСОУКР error catalogue, 2022)

Overlap with the Jira archive is small and named: 1.27↔SD-1882, 1.13↔SD-1524/SD-1721, 1.34↔SD-1443, 1.18↔hdesk 00101947. Net new support cases from the mail stream: 34.

Proposed resolution P — the corrected counts.

Catalogue row Jira count (§ 2) + OTRS mail + HDesk queue Corrected "tickets asked" Rank change
#16 VIN / reg-no / vehicle-type correction 16 +12 +1 29 16th → 6th; the largest OTRS-only stream; bus factor stays low; moves into build group 1
#7 sync compare + fix 32 +7 +3 42 7th → 5th
#8 ИП office setup 31 +4 35 8th → 7th; the four threads are the „регистриране/разкриване на офис" shape with policy-number counters (/add-agent seed)
#12 getRates / pricing check 21 +3 +3 27 12th → 10th
#2 retransfer / stuck transfer 112 +3 115
#14 duplicate / ЕИСОУКР 17 +2 +1 20
#26 factor / LOV / nomenclature add 11 +3 14
#5 discount / deductible fix 40 +2 42
#23 cargo text field · #31 BSO · #4 Kibana · #9 ownership 12 · 5 · 45 · 31 +0 · +1 · +1 · +1 +1 · — · — · — 13 · 6 · 46 · 32
§ 1 "configuration change" 32 +3 +39 74 the configuration stream is 2.3× the Jira count; it is the Configuration module's evidence base, not a skill

Two rules follow. (1) The HDesk connector's intake is the OTRS queue, not the mailbox: the same ticket arrives twice (queue row + notification mail) — Stage Classification's origin-key dedup treats the OTRS ticket number as the key and the mail as a duplicate channel. (2) The "Ablera" queue is Configuration-module intake by default: a case opened from it starts at the configuration root's intake conversation (D35) — narrowed by D143: every client case opens on the Support root, and the queue's Configuration default is an S1 classification hint that leads to a handover (Hd), not a channel route — and the seven support-shaped exceptions above are re-routed by the root, not by the queue.

Caveat / C kept, reworded. The cache holds 52 of ≥ 77 queue tickets and the mail archive holds what an operator chose to file; the population is the live OTRS queue. The corrected counts above are the eval-set input; the first Support eval set re-counts on a full read-only export of the queue through aisa-hdesk (hdesk/scripts/gen_status.ps1, read-only mode) — owner: support author.

Applied in. Agents Memory and Skills § 8–9 — the two streams as rows, the corrected counts, #16 in build group 1 (D59); Support Module — intake rule (1). The open part survives in the Challenges Register against Agents Memory and Skills: the counts are re-taken on a full read-only export of the OTRS queue.


R2-2 CH-46 · Agents — consult latency: the consult queue

Challenge. A lateral consult is a spawned task on another profile; if that profile's domain is busy, the consult waits. Proposal named, not designed: per-domain queue, timeout, "no answer" as evidence.

What I did. Read Agent Runtime § 3–4, § 7 (parking, pool with fenced leases — Solutions CH-48), the agent-graph budgets (stage agent ≤ 4 concurrent sub-agents, 1 DB session per environment), the profile definition, Platform Details PG-12 (escalation intervals), Measurements § TT (median case 1.5–2 h), Support Case Studies Case 1 (consult to source.serdica-backend on a guard's semantics) and Case 7 (consult to configuration.abacus).

Finding F. "Busy" is not a worker: sub-agents run in-process in any pooled worker (Agent Runtime § 3, § 7; Solutions CH-48), so a consult on another profile can always be started. What it competes for is the owning profile's concurrency cap (≤ 4 sub-agents per stage agent; 1 DB session per environment; INSIS 6 sessions per user) and its budget slice. A consult is a Consult / ConsultReply message pair (Agent Runtime § 4) with no deadline, no priority and no defined "no reply" outcome today.

Proposed resolution P.

The queue is a view, not a table. A consult is a TASKS row with kind = consult, profile = <owning profile>, parent = <requesting task>, deadline, priority; the per-domain consult queue is TASKS WHERE kind='consult' AND state='open' ORDER BY priority, created per profile. Any pooled worker takes it under the fenced lease.

Capacity is reserved, not shared. Every profile that may be consulted declares budget.consult_concurrency (default 2) — a slice of its own cap that stage work cannot consume, so a long S2 run cannot starve a Support investigator's pricing question. A consult task never spawns (depth 1), never writes, and reads only through the requester's grant subset (grants ⊆ requester's — a consult cannot read what the asker may not).

Deadline. The requester sets it from its own budget: 10 minutes wall-clock for a memory-only consult (answered from the owning node and articles, no connector call); 30 minutes for a consult that needs reads; never more than the requester's remaining turn budget. Ten minutes is under a tenth of the median v1 case (1.5–2 h, Measurements § TT); thirty is the size of one investigation phase.

No answer is evidence. On expiry the runtime, not the consulted agent, writes ConsultReply {outcome: no_answer, reason: timeout | refused | budget, waited_s, queue_depth_at_request} with trust class absent. The requester continues with the question listed as open evidence; the verifier treats it as unsettled, never as settled-by-silence. The same question hash within one case returns the earlier reply (no second spawn).

Priority. Consult priority = the requesting case's SLA class (Sev 1 > Sev 2 > Sev 3/4; a configuration case ranks as Sev 3); within a class FIFO; a requester at ≥ 80 % budget or with a gate waiting on it gets one step up. No preemption of a running consult or of the owner's stage work — the reserved slice is the whole mechanism.

Escalation. After no_answer a Sev 1–2 case may re-ask once with priority urgent; any other case proceeds and emits a Finding to the owning domain: "question X went unanswered" — the dreaming pass reads unanswered consults as the signal that an article is missing.

Alternatives rejected. Consults on the requester's own profile (loses the owning domain's judgement — the reason consults exist). Preemption (a half-written stage plan is worse than a ten-minute wait).

Confirms it. T1 ledger per domain: consult wait p50/p95, no_answer rate. Targets: no_answer < 5 %, p95 wait < half the deadline. Above 10 % no_answer for a domain, raise its consult_concurrency before touching the deadline. Owner: platform team (T1).

Applied in. Agents § 5 — consult mechanics, and D92 which fixes the consult/handover distinction around them; Agent Runtime § 4Consult/ConsultReply with deadline, priority, outcome; Agents § 0budget.consult_concurrency. The wait and no_answer targets remain a first-wave measurement.


R2-3 CH-31 · Stage Application and Verification — the UI-action application kind: acting identity and audit record

Challenge. Some fixes are UI actions — retransfer, „Върни към предложение", „Enable login" (SD-1717, SD-1729, SD-1554). The acting identity (operator's own account, or a service account with an impersonation policy that does not exist yet) and the ledger record are undefined. Note: Solutions CH-31 answers the verification replay (test identities, register row CH-32); this row is the application side and was empty.

What I did. Read Support Case Studies Cases 1, 5, 8 and the G-10/G-11 gap rows; memory/feedback/insis_dml_executor_and_username.md; Trust and Data § 2–4 (grants, iteration grants, browser evidence); the service-identity list (now Software Architecture § 10); Failure and Recovery § 2, § 4. Ran on PROD IPAL: the column sets of SRD_SYS.USER_ACCOUNTS, SRD_SYS.USER_ROLES, SRD_CUST.SR_USER_NOTES; accounts with company = ABLERA or user_name/user_email like %ablera%/%underwr%; USER_TYPE distribution.

Finding F. - v1 performed the SD-1717 retransfer „Подпиши и трансферирай" as an Ablera staff account (abl_underwriter in the case study), the INSIS row then carried the transfer layer's username, not the operator's (SERDICA_ACCESS is what the IPAL→INSIS transfer writes — insis_dml_executor_and_username.md § 2); SD-1729's „Enable login" ran from the admin UI; SD-1554's fix is a four-step UI sequence with decisions between steps (Case Studies Cases 1, 5, 8). - PROD IPAL (02.09.2026): seven USER_ACCOUNTS rows with COMPANY = 'ABLERA', all USER_TYPE = 'EMPL', LOCK_ACCOUNT = 'N', CURRENT_BRANCH = 1915213, roles UR_OPERATIONS, UR_UNDERWRITER, each bound to a person (SR_CUST_ID set) and Identity-Server-provisioned (USER_GUID set), USER_NAME empty (the login key is the e-mail). No non-person platform identity exists in IPAL today. USER_TYPE population: EMPL 8 063 · AGENT 999 · NULL 4 155. - SR_USER_NOTES(SR_USER_NOTE_PK, USER_ACCOUNT_ID, SR_CUST_ID, SR_POLICY_ID, SR_CLAIM_ID, AUDIENCE, NOTE, TSTAMP, IS_READ) — every UI action leaves rows keyed by the acting account and the policy; this is the natural write-log record of a UI action. USER_ROLES(USER_ACCOUNT_ID, USER_ROLE).

Proposed resolution P. Three acting identities, chosen by action kind and environment class. The platform never acts under the reporter's user and never holds a person's credentials; impersonation is rejected (Authority has no impersonation grant, the audit could not separate person from platform, and a person-tied account is personal data in the ledger).

Identity Used for Provisioning Rule
Platform actor aisa.ui.<env> — one IPAL USER_ACCOUNTS row per environment: USER_TYPE EMPL, COMPANY ABLERA, CURRENT_BRANCH 1915213 (the Ablera branch, so a debit note it triggers is never stamped with a customer office — the KI-043 rule), roles = the minimum for the action catalogue (UR_OPERATIONS + UR_UNDERWRITER for retransfer / return-to-application / recalc; the administration role only on the account used for „Enable login"), LDAP-backed like every account (a Bulstrad IT request, the same as the CH-31 test accounts), credentials in Vault UI actions the platform performs under a grant on any environment; on customer-facing environments after H5 implementer + Bulstrad IT (LDAP entry) SR_CUST_ID points at a synthetic Ablera contact, never a person; the account is the only IPAL identity the browser connector may log in as
Test identities aisa.test.<role> (Solutions CH-31) replaying the customer's surface in read mode — verification, never writes as CH-31 role-set equality with the reporter asserted before the replay
The operator's own account, in the operator's own browser when the platform actor lacks the role, or the connector is read-only by scope on that environment (PROD until the grant model is proven), or the action is one the organisation reserves for a person none the packet says "operator performs step X in the UI; the platform verifies": the human step is a gated task in the inbox and the platform's ledger records who did it (Authority claim) and what it observed after

The audit record. A UI action is a write-log row of kind UI_ACTION: {case_id, plan_step_id, grant_id, environment, actor_account, control (route + control label, e.g. «Подпиши и трансферирай»), target (handle), pre_state_hash (the state fields' DOM text through the connector's handle substitution), request_ids (the backendfields.RequestIdvalues observed — Kibana-correlatable), produced_records: SR_USER_NOTES pks by actor_account after t0 · MIGR_LOG rows for the policy after t0 · the C_POLICIES status triple after · TRANSFERRED_ITEMS row, screenshot_artefact_hash (a customer-identifying artefact under evidence retention, never sent to a model — Trust and Data § 4), outcome, duration}. The ledger keeps handles; the write log keeps identifiers (PG-13).

Effect classes per action (Failure and Recovery § 2, § 4). Retransfer: compensable (return-to-application) with the irreversible parts named when the transfer issues (INSIS numbering, documents, ГФ registration for 4710); return-to-application: compensable (re-transfer) but a consumed number is named; „Enable login": compensable (disable) — it publishes the Identity Server profile, an external call. Dry-run of a UI action = navigate to the control and record its enabled/disabled state without acting (the "reach" test). Preflight = the action's precondition read immediately before (the status triple, SR_USER_NOTES tail, INSIS state) — a mismatch re-opens the gate with the diff. A correction series (SD-1554) runs under an iteration grant bound to object set + day (Trust and Data § 4 G-17), one preflight per iteration.

INSIS attribution. Whatever IPAL identity clicks, the INSIS rows carry SERDICA_ACCESS (the transfer layer). The record therefore does not claim INSIS attribution; it links the MIGR_LOG trace and the INSIS POLICY_ID that resulted.

Alternatives rejected. Impersonating the reporter (above). A shared human account for the platform (the v1 shape: a person is on the hook for what a program did; and it is personal data in SR_USER_NOTES forever).

Still C. (a) Bulstrad IT provisions the LDAP entry for aisa.ui.<env> — request text = the CH-59 pattern; (b) whether „Enable login" (Identity Server publish) can run under a non-administrator role — one look at the admin route's AllowedRoles; (c) confirmed on the first T3 UI action: the UI_ACTION row and its produced records present, the actor never a person.

Applied in. Stage Application and Verification — the UI-action kind with the identity table and the UI_ACTION record; Software Architecture § 10 — the IPAL UI actor aisa.ui.<env>; Failure and Recovery § 4 — the UI-action effect classes. The open part survives in the Challenges Register against Stage Application and Verification: the browser connector and the impersonation policy for UI actions are a build item, and (a)–(c) above are its confirmations.


R2-4 CH-44 · Agent Framework — framework versioning

Challenge. A framework change (loop, pipeline) alters every agent's behaviour without any profile changing; the eval sets of all published profiles re-run on a release and the ledger records the framework version per turn. Whether that is affordable is the eval-cost question. Register pointer wrongly names the profile-inheritance solution.

What I did. Read Agent Framework § 1–5, the ledger record fields (now Architecture § 1, the ledger), the prompt-governance sections (now Agent Framework § 6), Solutions CH-71 (eval budget: nightly dirty domains, weekly module corpus, 20 % of case spend), Agent Runtime § 9.2 patterns 18–19 (replay tests), the image-tag deployment model (now Software Architecture § 10), and the ≈ 30 profile rows across the three modules.

Finding F. The ledger record already carries "profile, prompt and adapter versions" but not the framework's; eval sets re-run on domain, skill or route change (CR-4) and no framework trigger is named; the deployable is one image per release, so a framework version is an image tag by construction.

Proposed resolution P. 1. The framework version is a record field. framework_version = the webservice assembly's informational version + git sha, stamped on every turn record and COST_LEDGER row beside profile/prompt/adapter versions, and on every OpenTelemetry invoke_agent span as serdica.framework.version. A case resumed under a newer framework writes a FRAMEWORK_CHANGED ledger event; checkpoints carry a schema version and release n must read release n−1's checkpoints. 2. What re-runs is decided by the release's own manifest. Every framework release names the § 1 services it touches (affects ⊆ {loop, tools, memory, gates, records, spawning, governance, operations}). Re-run rule: replay tests always (recorded sessions, no API keys — the framework's own regression, in CI); the eval sets of profiles whose declared services are in affects plus a canary set (one root and one stage profile per module, in full); a full re-run of every published eval set only when affects includes loop or tools — context assembly, compaction and the permission pipeline are the two services that change every agent at once. 3. Budget and cadence. A framework release is scheduled like a publish — the pre-release run is mandatory and outside the weekly 20 % envelope of Solutions CH-71; releases are at most monthly in T3. Size: ≈ 30 published profiles × 20–50 graded cases = 600–1 500 gradings per full run — affordable monthly, not per commit. 4. Rollback is redeploying the previous image tag; sessions are not migrated (checkpoints are data).

Alternatives rejected. Full re-run on every release (patterns 18–19 already cover the loop mechanically; the eval sets measure agent judgement, which a records change does not touch). No re-run below loop (a tools change to the permission pipeline changed every write path in dsh's own history).

Confirms it. The first framework release after a publish: the delta report (sets run, regressions found). If two consecutive loop releases show zero regressions in the full run, the canary rule replaces the full run. Owner: platform team.

Applied in. Agent Framework § 6 — framework versioning and the release trigger; Architecture § 1 — the framework version in the ledger's record list. The first-release delta report remains the measurement.


R2-5 CH-82 / CH-83 · Software Architecture — memory store shape; the handles table in SRD_SUPPORT

Challenge. Git bodies + Oracle metadata versus Oracle CLOBs; and whether the pseudonym map may live in SRD_SUPPORT at all. Register pointers name the backup and the pseudonym solutions, neither of which decides these two.

What I did. Read Software Architecture § 3, § 6; the memory tree and its publication states (now Agents Memory § 1–2, § 5, § 7.4b — states, version pinning, immutability); Measurements § RE-8 (retrieval alternatives run over bodies); Measurements § DB-6 (QA has no working backup); Solutions CH-34 (CASE_HANDLES), CH-80 (no person pseudonym), CH-02 (15-minute export to a place the DB account cannot reach); Platform Details PG-13 (retention is configuration; default never expires; only the customer closes).

Finding F. Four facts decide the store: articles are immutable once active and versioned (Memory § 7.4b); retrieval is measured over bodies (Repo evidence § 8 — the grep alternatives index full articles); the platform already owns a GitLab repository for the PL/SQL mirror (Software Architecture § 6); and the "one backup domain" argument for CLOBs is void today — QA has no valid backup (DB evidence § 6), so an Oracle-only store would have no durable copy while a GitLab-mirrored repository has one. For handles: today's decision is one schema, no separate runtime principal, so "a separate more restricted schema" contradicts the decision; and the write log already carries identifiers in SRD_SUPPORT by decision (PG-13), so a second identifier-bearing table in the same schema changes nothing about the schema's classification.

Proposed resolution P — memory store. Git is the store; Oracle is the projection. Repository aisa-memory on the QA host volume, mirrored to gitlab.ablera.dev by push (project token, push-only); layout = the tree of Memory § 1; one file per article <domain>/<slug>.md with frontmatter {id, version, state, owner_profile, provenance[], verify{}}; AGENTS.md per node. States live in the frontmatter too, so a state change is a commit. SRD_SUPPORT.MEMORY_ARTICLES (id, domain, slug, version, state, git_sha, body_hash, owner_profile, created_case, activated_by, retired_by) is an index rebuildable from the repository, and memory reads/writes are ledger events as today. Write order: commit first, row second; verify-memory.sql + git log at start reconcile the row side to HEAD. Search: ripgrep over the working tree (the measured baseline's medium); a vector index is a rebuildable projection over the same files. Reasons: history and diff for free; the PII scan and the writing-practice checks are file tools; the durable copy exists today; the cross-case join key (Solutions CH-80, decided as D44) is a frontmatter field, not a column.

Alternatives rejected. CLOBs (no durable copy on QA today; diff and history re-implemented; file-based tooling lost). Git only (no queryable state, no join to the ledger's article-version pins).

Confirms it (wave 1). Every row's git_sha resolves and body_hash matches (100 %); the retrieval measurement runs over the working tree; a rehearsal drops MEMORY_ARTICLES and rebuilds it from frontmatter with zero differences. Owner: Vladimir (decision), platform team.

Proposed resolution P — handles table. CASE_HANDLES lives in SRD_SUPPORT, and the boundary is cryptographic, not schematic. CASE_HANDLES (case_id, handle, kind, value_enc RAW, key_id, created, destroyed_at); value_enc is AES-GCM under a per-case data key wrapped by a Vault transit key — Oracle never holds plaintext, a DBA's SELECT * and every backup carry ciphertext, and the key material is not in the database. Re-identification = decrypt inside the connector process + ledger event REIDENTIFY. Destruction when the customer closes the case (PG-13) = delete the rows and destroy the case data key in Vault — crypto-shredding, so backup copies become unreadable too. Grants: the platform account only; no view, no synonym, no DB link exposure. Retention rows for the class handles default to "at customer close", editable like every retention row.

Alternatives rejected. A separate restricted schema (contradicts today's one-schema decision; protects one of two identifier-bearing tables). Oracle TDE alone (protects the file, not the DBA's SELECT).

Confirms it. The data-boundary fixture (Solutions CH-34): ten identifiers → zero plaintext in any SRD_SUPPORT column except WRITE_LOG.statement; SELECT * on CASE_HANDLES shows ciphertext; a shredded case's rows cannot be decrypted. Owner: platform team (T3).

Applied in. Software Architecture § 6 — the memory store and the SRD_SUPPORT rows; Architecture § 1CASE_HANDLES in the SRD_SUPPORT evidence group with the encryption note; Trust and Data § 4 — handles crypto-shredded at customer close. The wave-1 rebuild rehearsal remains the measurement.


R2-6 CH-36 / CH-45 · Which investigator leads a cross-system symptom — the two-phase rule and its measurement

Challenge. Investigators are profiled by symptom (D11); most cases span systems; the lead rule is "set on the first ten cases". Solutions CH-35 already proposes a symptom-vocabulary precedence (transfers → printing → pricing → access → master data → health) and flags its own doubt (Solutions § b-5): a printing symptom caused by a transfer defect would be led by the wrong investigator for its first hour — the rule may need the mechanism hypothesis.

What I did. Read Stage Investigation § 1–3 (mechanics 0–8; the verifier), the support agent graph, Support Case Studies Cases 1, 3, 7, 8 (which domains produced evidence), Agents Memory and Skills § 8 (transfer 22 %, corrections 32 % — most corrections are transfer consequences), Solutions CH-35.

Finding F. The symptom vocabulary is available at S1 at zero model cost; the mechanism hypothesis is better but exists only after mechanics 0–2 have run (Case 7: the transfer/pricing question was decided by the invocation evidence, not by the customer's phrase). The two are not alternatives; they are two moments.

Proposed resolution P — the two-phase lead. 1. Provisional lead at S1 by the CH-35 precedence — deterministic, so no case starts with a routing argument (D11). 2. Hypothesis checkpoint after mechanics 0–2 (cross-channel scan, id decode, invocation evidence) or at 20 % of the investigation budget, whichever first: the provisional lead emits mechanism_hypothesis {layer, system, domain, confidence} as a required phase output. If domain differs from its own, the root reassigns the lead to that domain's investigator with the evidence so far — recorded as plan revision 2 with reason hypothesis_reassignment; the first investigator becomes a consult. At most one reassignment per case; a second disagreement is a DeadEnd → H6 ("cross-system mechanism unclear"), never ping-pong. 3. The lead owns the mechanism sentence; every other domain is a consult whose reply is evidence (unchanged).

Measured on the first ten cross-system cases (a case is cross-system when ≥ 2 domains produced evidence). Per case: provisional lead · final lead · reassigned? at which minute · mechanics run before reassignment · spend before reassignment · verifier verdict. Decision thresholds: reassignment ≤ 2/10 keeps the precedence as is; 3–5/10 rewrites the precedence from the observed final leads; > 5/10 drops the provisional lead — triage then produces the hypothesis itself with one cheap model call. Secondary: spend before reassignment as a share of case spend (target < 15 %); per domain, consulted-but-never-leads count (a merge candidate).

Alternatives rejected. Hypothesis-only routing (a model call before any evidence, at S1). Vocabulary-only (the b-5 failure: the wrong lead for an hour with no correction step).

Confirms it. The ten-case table above, in the ledger. Owner: support author.

Applied in. Stage Investigation — the two-phase lead and its thresholds. Read with D83: investigation is entered from the take, so a case reaches S2 only when S3 finds no ready solution; the two-phase lead governs the cases that do enter it. The ten-case table remains the measurement.


R2-7 S3b · The INSIS sub-stage — withdrawn by D85

Status. This section designed the INSIS sub-stage S3b: an insis specification section, an oracle-insis connector catalogue of six write operations, a grant scope of its own, environment pairing, a teardown checklist and a transferred proof rung. D85 removed all of it. The INSIS side of a dual-system product is not configuration work: it is one PL/SQL script, run once per product, recorded as a named deliverable with an owner — the script, who runs it, on which environment, and the date. A change to the script is Development work reached at gate Hd. The configuration proof ladder ends at issued; arrival in the incumbent system is proved by the Support module, which owns transfer investigation. The design in this section is therefore not planned work, and any page that still describes S3b, the insis specification section, the INSIS teardown or a transferred rung is out of date, not ahead.

What survives — the measurements taken on PROD, 02.09.2026 F.

Applied in. Stage IPAL § The INSIS side; Configuration Module § 7; Stage Normalization § WS-3.


R2-8 CH-28 · The product schema — v1 shapes for the v0 gaps

Challenge. Known shape gaps of v0 (Configuration Module § 8 cases D, M, P, S): conflict groups; LBRR object scoping; LB_COVERS_DEF dimension and currency; loading rating file / formula / cap / per-LD combination; ld_constraints; top-level limit_restrictions; documents; annex_types; tariff_constraints.kind lacks bonus-term and group-size gating; level-variant covers and consumption modes (8000); tariff required although cargo has no ABACUS tariff; rating_owner. Register pointer wrongly names the rule-combination testing solution.

What I did. Read contracts/product.schema.json in full; the configuration cases CS-3–CS-7 and the gap rows D, M, P, S (Configuration Module § 8); knowledge/product_config_new_product.md § 4 (the LB_*/LBRR_* shapes); Measurements § DB-2 (PR_PRICING_FACTOR_ANNEX = per-product annex change-sensitivity list); Solutions CH-01 (versioning: additive = minor), CH-20 (meta.lifecycle).

Proposed resolution P — schema 1.1, additive, all additionalProperties: false. Field names follow the existing vocabulary (key, source, dim ∈ V|P, currency ^[A-Z]{3}$).

Gap Where in product.json Shape Consumer / table
Conflict groups new top-level cover_rules object, cover_rules.conflicts[] { covers: [key, key, …] (minItems 2), object, rule: "at_most_one" \| "exactly_one", scope: "product" \| "offer:<code>", source } S4 → LBRR_COVER_CONFLICTS (one row per cover per object); offer-scoped groups → LB_OFFER_COVERS extents
LBRR object scoping cover_rules.dependencies[], cover_rules.conflicts[].object, cover_rules.limit_restrictions[].object dependencies[]: { cover, object, depends_on: [key…], source } — every rule carries object (an objects[].code) because the tables key on OBJECT_CODE S4 → LBRR_COVER_DEPENDENCY(BASIC_PRODUCT_CODE, COVER_CODE, OBJECT_CODE, DEPEND_ON)
Top-level limit_restrictions cover_rules.limit_restrictions[] (not top-level: it is a cover rule) { cover, object, dependent_on: <cover key>, percentage, type: "EXC", sum_group, source } S4 → LBRR_LIMIT_RESTRICTIONS
LB_COVERS_DEF dimension and currency offers[].covers[].values[] { var: "LIMIT" \| "DEDUCTIBLE", dim: "V" \| "P", amount, currency, rule: { min, max, dim, currency, match_offer_amount: bool, match_offer_currency: bool, match_offer_dim: bool } } S4 → LB_COVERS_DEF + LB_COVERS_DEF_RULES
Loading rating file / formula / cap / per-LD rule ld[] gains rating, cap, applies_after rating: { kind: "flat" \| "grid" \| "formula", file: "<PPA_PRODUCT_FILES name>", formula, grid: { row_factor, column_factor, row_labels, column_labels, rates } }; cap: { amount?, percent?, currency? }; applies_after: [ld code…] (combination per LD already exists) S2 → PPA_PRODUCT_LD, PPA_PRODUCT_FILES
ld_constraints new top-level ld_constraints[] (distinct from tariff_constraints, which are premium-level) { code, kind: "max_total_discount" \| "max_total_loading" \| "exclusive_set" \| "requires" \| "order", ld_codes: [..], value, rule, source } S2/S3 → LT_LD_CODES, CFG_LD_CONFLICTS, PPA rules
documents new top-level documents[] { code, name_bg, kind: "policy" \| "certificate" \| "debit_note" \| "terms" \| "questionnaire" \| "other", engine: "bi_publisher" \| "pdf_generation", template, languages: ["bg","en"], stage: "POL" \| "ANNEX" \| "CANCEL", gates: [{ param: "DOCUMENT_TYPE", values: ["DT_POLICY"] }], insis_rep_id, source } S5 → CFG_PRINT_DOCS (+ TEMPLATE_PARAMETERS gate); the INSIS-side CFG_PRINT_DOC* rows are in the per-product PL/SQL script (D85)
annex_types new top-level annex_types[] (paired with meta.lifecycle of Solutions CH-20) { code, name_bg, operation: "change" \| "cancel" \| "ownership" \| "period" \| "other", change_sensitive_factors: [factor code…], transfers: bool, source } S3 → annex catalogue and PR_PRICING_FACTOR_ANNEX (the change-sensitivity list — Measurements § DB-2)
tariff_constraints.kind tariff_constraints[] kind becomes an open string with a params object; the validator warns on unknown kinds. New known kinds: bonus_term { paid_months: 60, covered_months: 65 }, group_size_gate { cover, min_persons: 150 }, min_persons_loading { max_persons: 5, loading_prc: 50 }, age_gate { min, max } S2 (rating conditions) or Hd:Source per Stage Abacus
Level-variant covers and consumption modes (8000) covers[] gains variants[] and consumption_modes variants[]: { key: "<child code>", level: "O" \| "L" \| "E", names, definitions[], source }; consumption_modes: ["PRV","REIM"], default_mode; reconciliation gains covers_document (parents) beside covers (distinct codes = parents + variants) so both counts are checked S3/S4; the health join rule (cover_order) lives in configuration/ipal
tariff required; rating_owner meta.rating_owner: "abacus" \| "insis" \| "policy_data" \| "none"; tariff required iff abacus; reconciliation.tariff_layers required iff tariff.layer_model present cargo 1101 family = policy_data (per-framework POL_PREM_RATE); INSIS-Forms-rated products = insis S2 skipped when not abacus (deployment set "ipal only", gap R)
(done) factors[].collected_at_quote removed POL only (D29)

schema_version"1.1"; validate_product.py gains: cross-reference of every cover_rules.*.cover, depends_on, dependent_on, ld_constraints.ld_codes, annex_types.change_sensitive_factors and documents.gates.param against covers[], ld[], factors[]; the rating_owner conditional requirement; the two cover counts. The broken fixture gains one violation per new rule. Every S2–S5 prompt declares the major it reads (1.x).

Alternatives rejected. A free extensions{} bag (four stages read four things); top-level limit_restrictions (it is a cover rule, and S4 reads one object).

Confirms it. The three-export gap pass of Solutions CH-01 (4704 family, 1101/1102, 8000) round-trips with zero "no field for this" entries; the fixture rejects every new rule. Owner: S1 author.

Applied in. Stage Normalization § WS-3cover_rules, ld_constraints, documents, annex_types and the meta.rating_owner gate, as product.schema.json 1.1. The insis section is not part of it (D85); § R2-7 above says why.


R2-9 The SSH-tunnel connector — reach as a grant-scoped, data-declared platform capability

Superseded in part, 04.09.2026 (D132, closing A-8). Every connection is direct; the tunnel connector, the via host, route.kind = ssh_tunnel and the TUNNEL_* ledger events below are not built. What survives of this round: reach as data in CONNECTOR_SCOPES (now route.kind ∈ {direct, unreachable}), the probe, the host operations (exec_readonly/exec_privileged), credentials in Vault, and the hygiene item. The text is kept as the record of the reasoning — see Software Architecture § 10.3 for the state in force.

Challenge. Decision today: connectivity to the customer network (LDAP, BI Publisher, SOAP, INSIS) is a platform capability through SSH tunnels and connector tooling, not a request to Bulstrad IT. v1 seed: memory/reference/ssh_mcp_cli.md and the ssh-* servers in .mcp.json. Design the connector.

What I did. Read .mcp.json (one entry ssh-prod-insis: npx ssh-mcp to 10.239.82.103, key auth, placeholders for user and key), ssh_mcp_cli.md (exec + sudo-exec, not read-only, secrets via env expansion), memory/reference/eisoukr_mtpl_status_service.md (SOA host soaserver21p.bulstrad.bg:7030 reachable only through an SSH tunnel via a Bulstrad production server; hosts-file reroute to 127.0.0.1; diagnosis ladder DNS → tunnel), kat_getkatdata_soap_pull.md (same host, /AdminServices/GetKATDataPS), knowledge/policy_print_recipe.md (BI Publisher PROD/TEST endpoints on the same SOA hosts, HEAD → 500 = alive; credentials in plaintext in the knowledge file), identity_server_ldap_authentication.md (Bulstrad_LDAP 10.250.10.140:389, AD failover 10.8.40.17:389), the network-reach and identity sections (now Software Architecture § 3, § 10), Trust and Data § 2, Failure and Recovery § 4, the Source cases G22 (a host connector seeded from ssh-mcp) and G31 (operations actions).

Finding F. Every customer-network target the modules need already has a named path in v1: direct TNS to the IPAL/INSIS databases from the office/VPN; an SSH tunnel through a Bulstrad server for the SOA host (BI Publisher, EISOUKR, GetKATData — three services, one host, one tunnel); LDAP/AD reached today only by the Identity Server. None of it is declared as data; the one .mcp.json server is unscoped (exec, sudo-exec, any command).

Proposed resolution P.

One library, two operation families. AI.Support.Connectors.Ssh: tunnelopen_tunnel(reach_id) → handle, close_tunnel(handle), probe(reach_id); hostexec_readonly(host_id, command ∈ allow-list) and exec_privileged(host_id, command) as a gated write (G31; H5-equivalent on a customer host). sudo is never enabled on the platform's key.

A tunnel is a grant-scoped resource that has no grant of its own. Opening a tunnel requires the grant of its target: a tunnel to BI Publisher PROD is used under PROD / BI_PUBLISHER / read; to INSIS PROD under PROD / INSIS / read|write. The check runs per use (each operation names its tunnel_handle), not per socket; a tunnel closes at case close, at its target grant's expiry (4 h write / 7 d read, Solutions CH-84), after 30 minutes idle, or on the hard kill switch (PG-18). Tunnels to one reach row are pooled and reference-counted across cases (one process resource); at most 2 open tunnels per case.

Reach is data — CONNECTOR_SCOPES rows of kind reach, one per environment × system:

{ "environment": "PROD", "system": "BI_PUBLISHER",
  "target": { "host": "soaserver21p.bulstrad.bg", "port": 7030, "paths": ["/Bulstrad_BIPublisher_Mediator/ReportService"] },
  "route":  { "kind": "ssh_tunnel", "via": "bst-prod-app", "local_bind": "127.0.0.1:17030" },
  "modes": ["read"], "credential_ref": "vault:kv/aisa/prod/bip", "health": "HEAD → HTTP 500" }
{ "environment": "PROD", "system": "EISOUKR_SOAP", "target": { "host": "soaserver21p.bulstrad.bg", "port": 7030,
  "paths": ["/gf-eisoukr-integration/mtpl-service/v1.0.0", "/AdminServices/GetKATDataPS"] },
  "route": { "kind": "ssh_tunnel", "via": "bst-prod-app" }, "modes": ["read"] }
{ "environment": "PROD", "system": "LDAP", "target": { "host": "10.250.10.140", "port": 389 },
  "route": { "kind": "ssh_tunnel", "via": "bst-prod-app" }, "modes": ["read"], "failover": { "host": "10.8.40.17", "port": 389 } }
{ "environment": "PROD", "system": "INSIS", "target": { "host": "10.239.82.103", "port": 1521, "service": "INSISDB" },
  "route": { "kind": "direct" }, "modes": ["read", "write"], "credential_ref": "vault:kv/aisa/prod/insis-ablera_support",
  "operation_allowlist": "insis-v1" }
{ "environment": "TEST", "system": "BI_PUBLISHER", "target": { "host": "soaserver21t.bulstrad.bg", "port": 7030 }, "route": { "kind": "ssh_tunnel", "via": "bst-test-app" }, "modes": ["read"] }

plus via hosts as rows: { "id": "bst-prod-app", "host": "…", "user": "aisa", "key_ref": "vault:ssh/aisa-prod", "sudo": false }. The Bulstrad IT answer to B-1 changes route.kind from ssh_tunnel to direct on rows — never code: that is what makes reach a capability rather than a request. Unverified addresses (10.239.82.108, 10.239.82.101 — CH-67) are rows with "verified": false and are refused for writes.

Credentials stay in Vault. SSH keys through the Vault SSH engine (signed certificates with TTL = tunnel lifetime; no long-lived key on the host volume) or key_ref to kv; service credentials (BI Publisher ABLERA, EISOUKR, INSIS ABLERA_SUPPORT) as kv references resolved per operation (Agent Runtime § 9.2 pattern 20), never rendered into a prompt, passed to the tunnel process through a scrubbed environment. Immediate hygiene item: the BI Publisher credentials printed in knowledge/policy_print_recipe.md § 2 move to Vault and the file keeps the reference.

Ledger. TUNNEL_OPEN {case, task, grant_id, reach_id, via_host, local_bind, credential_ref, handle, opened_at} · TUNNEL_CLOSE {handle, reason: case_close | grant_expiry | idle | error | kill_switch, duration_s, ops_count} · TUNNEL_REFUSED {reach_id, reason}; every operation envelope carries tunnel_handle; probe results feed the Connectors screen (UI screen 7). Effects: open_tunneleffects: [{kind: external_call, reversibility: rollback}] (closing it undoes it); exec_privileged per command; a BI Publisher runReport renders and registers nothing (document effect only if saved as an artefact).

Alternatives rejected. Keeping ssh-mcp as is (unscoped exec, personal key, sudo). Asking Bulstrad IT for routes first (D46; and topology B is the same tunnel drawn the other way).

Still C. (a) Which Bulstrad host is via — the v1 memo says "one of the Bulstrad production servers", the user's own tunnel; name it from Vladimir's tunnel configuration; (b) a platform SSH user on that host (the personal key is not acceptable for a service) — a small Bulstrad IT item that the decision does not remove, only shrinks to one account; (c) confirmed at T1 by the probe from the QA host: HEAD ReportService → 500 and a TNS ping through the tunnel, with TUNNEL_OPEN/CLOSE pairs in the ledger.

Applied in. Software Architecture § 3 — "Reach is data", the reach-row shape, the rule that the Bulstrad IT answer changes rows and not code, and AI.Support.Connectors.Ssh in the connector list; Failure and Recovery § 4 — tunnel effects; Trust and Data § 2 — "tunnel open" as a side effect. The probe itself survives as the six reach rows in the Challenges Register against Software Architecture — all closed by one probe from the QA host on first deployment.


R2-10 CH-10 / CH-09 · Value and ROI — the switch cost on ten interruptions; the 25 % rule per ticket type

Challenge. Two numbers nobody has: the switch cost per interruption (D-2) and whether the 25 % rule — true time is a quarter of the analysis card's estimate — holds for all ticket types (D-3). A third, the hourly rate (D-1), was struck: money is not a metric of this platform (D52, D79), so the unit is hours throughout.

What I did. Read Value and ROI § 1, § 2b, § 5; Measurements § TT (method, reliability, the ratio table); Metrics § Measurement log.

Finding F. The timing data cannot test the 25 % rule by itself: both sides are agent-written (agent elapsed vs the agent's own financial card), and the per-type ratio human_true / agent (reliable subset) already varies threefold — access/account 0.09, master data 0.13, data correction 0.28, transfer 0.29, configuration 0.29, incident 0.40 — which means either the agent's elapsed time is inflated for the low-ratio types (waiting on LDAP / Bulstrad IT is inside "elapsed") or the card over-estimates them. Only a human-measured handling time separates the two.

Proposed resolution P — one protocol, two numbers.

Sample. Ten consecutive real interruptions, across at least three developers, both channels (Jira and OTRS mail), excluding scheduled support slots (a batch is not an interruption). Same ten tickets feed the CH-09 measurement (ten tickets timed by hand alongside the platform).

Four timestamps per interruption, written by the developer into a one-line CSV as they happen (the tool appends to 90 Reference/Switch Cost <date>.md; nobody edits by hand): T0 interruption noticed · T1 work on the ticket starts · T2 ticket work ends · T3 back in flow on the previous task = first meaningful edit, test run or commit. Recorded with each: ticket key, request type, severity, DB write yes/no, what was interrupted (debugging / review / meeting / configuration).

Derived. Switch cost = (T1 − T0) + (T3 − T2) (context save + re-immersion); handling = T2 − T1. Report medians and p75 per component; the model uses the median switch cost. Cross-check T3 against git/IDE (last save before, first save after) — the objective trace where it exists.

The 25 % check per type. For each of the ten tickets, true/est = (T2 − T1) / human_est_h from the same analysis card; group by request type; the rule holds for a type when the median ratio is inside 0.15–0.35; outside it the flat factor is replaced by the per-type factor in Value and ROI § 2b and the Agents Memory and Skills saving is recomputed per type. Because a ten-ticket sample cannot cover nine types, the check runs first on the three largest (data correction, transfer, incident = 71 % of tickets) and the rest keep the flat factor with the caveat named.

Agent comparator. The agent's active window for the same tickets (the 43-ticket timeline_span median 0.95 h, and post-T3 the platform ledger's case clock minus parked time) — never elapsed.

Alternatives rejected. Self-reported percentages ("about a quarter") — the number under test. Literature values for re-immersion (15–25 min) — a prior, not a measurement.

Confirms it. The CSV with ten rows and the two derived numbers, filed as F in Value and ROI § 1 (switch cost) and § 2b (per-type factor). Owner: development manager. Two calendar weeks.

Applied in. Value and ROI § 5 — the protocol; § 2b — the per-type test. D52–D54 then set the surrounding rules: hours only, switch cost 20 % plus a fogginess risk, and a ± 25 % adjustment on both sides with the note that times vary by domain and person. The open part survives in the Challenges Register against Value and ROI: the ten-interruption CSV does not exist yet.


R2-11 What the pointer sweep left open

The original §§ 11–13 were a pointer-correction list for challenges_triage.csv and a summary of §§ R2-1 to R2-10. The corrections were applied and the register regenerated, so both are gone. Two items in them were substance rather than bookkeeping, and one of the two is still open.

Queries run 02.09.2026 (SELECT only, disconnected after). PROD IPAL — ALL_TAB_COLUMNS for USER_ACCOUNTS, USER_ROLES, SR_USER_NOTES; USER_ACCOUNTS filtered by company and e-mail pattern with USER_ROLES aggregated; USER_TYPE counts; CFG_MAPPING_COVERS/_LIMITS/_COVERS_COMM counts for 1100/1101/1102/1103/2215/3607; CFG_MAPPING_FLFLD shape and count; CFG_GEN_COVERS/_CONDITIONS/_PREMIUM_TAXES@insis counts. PROD INSIS as ABLERA_SUPPORTUSER_TAB_PRIVS_RECD, USER_ROLE_PRIVS, ROLE_TAB_PRIVS, USER_SYS_PRIVS.