# Verification record — `bg/mvr/zayavlenie-za-izdavane-na-svidetelstvo-za-upravlenie-na-mps` v1.0.0

This file is the **source-review record** for this document version, per the
`manual-source-review-v1` practice.

## Current claim

- **`status`:** `draft`
- **`verification.method`:** `manual-source-review-v1`
- **`verification.lastVerifiedAt`:** `2026-07-14`
- **`maturity.level`:** `structural-reference`

This is GovSchema Standard Research cycle **GOV-2853** (child of GOV-2851,
"GovSchema Standard Research"). This schema **opens Bulgaria's DMV vertical
(3 of 6)**, following Taxes (two schemas, GOV-2821) and Visa
(`bg/mvnr/zayavlenie-za-izdavane-na-natsionalna-viza-tip-d`, GOV-2830).

## Provenance of this candidate

This candidate was pre-scouted, screened, and confirmed genuine during the
prior GOV-2837 cycle (which authored Romania's Visa vertical instead and left
this Bulgaria DMV candidate as an explicit, well-sourced, ready-to-author
backlog item — see CATALOG.md's GOV-2837 correction to GOV-2830's earlier,
too-broad "Bulgaria DMV is a dead end" claim). That prior screening
established: MVR's "Бланки и образци" (Forms and specimens) static-forms page
links this specimen directly and unauthenticated, HTTP 200,
`application/pdf`, 382,212 bytes, a genuine text-layer (non-scanned) static
specimen — a **different** MVR (Ministry of Interior) form from the
already-confirmed vehicle-registration dead end (GOV-2830: that page states
the application "is generated by MVR's information system" with no
independently-fillable blank ever published; this driving-licence specimen,
by contrast, is a genuine downloadable blank template).

This cycle independently re-fetched, re-derived, and re-verified all of the
above from scratch rather than trusting the prior cycle's numbers.

## Source verification (independently re-fetched this cycle)

- **Forms-and-specimens page:** `https://mvr.bg/dbds/%D0%B4%D0%B5%D0%B9%D0%BD%D0%BE%D1%81%D1%82%D0%B8/%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE-%D0%BE%D0%B1%D1%81%D0%BB%D1%83%D0%B6%D0%B2%D0%B0%D0%BD%D0%B5/blanki`
  ("Бланки и образци," under MVR's Дирекция "Български документи за
  самоличност" / DBDS section) — HTTP 200, fetched fresh this cycle with a
  browser-like `User-Agent`. The page lists, among many identity-document
  specimens, a direct link titled "Заявление за издаване на свидетелство за
  управление на моторно превозно средство - образец" pointing at this
  schema's own `source.url`. (DBDS is the Identity Documents directorate that
  hosts this static-forms page; MVR's driving-licence *issuing* authority is
  the Ministry as a whole, per the form's own footer, so `authority.name` is
  kept at the ministry level, consistent with how this registry attributes
  other nationally-uniform forms hosted on a sub-unit's own page — e.g.
  `ro/dgpci`'s county-Prefecture-hosted-but-nationally-attributed precedent.)
- **Fetched file:** `https://mvr.bg/upload/301782/%D0%B7%D0%B0%D1%8F%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20%E2%84%96%202a%20%D0%A1%D0%A3%D0%9C%D0%9F%D0%A1.pdf`
  (this schema's `source.url`).
  - **HTTP 200**, `Content-Type: application/pdf`, **382,212 bytes** —
    matches both the prior cycle's own byte count and the response's own
    `Content-Disposition: ...; size=382212` header, byte for byte.
  - **`sha256`:** `e633ee22c10e650186b69b5c2278a51c02eb8fb7c413fee875c724066cec9576`,
    confirmed **byte-identical across two independent fetch methods**
    (`curl` and `wget`, both against the live `mvr.bg` origin — no Wayback
    fallback was needed this cycle since the live source fetched cleanly).
  - `Last-Modified: Tue, 14 Jul 2026 04:03:58 GMT` (this response header
    reflects the fetch time itself, per Cloudflare's `cache-control: private`
    handling of this endpoint — not a meaningful document-revision date).
  - **1 page.** Confirmed via `pdfjs-dist@3` (legacy build, Node.js):
    `doc.numPages === 1`. Zero AcroForm `Widget` annotations
    (`getAnnotations()` returns an empty array) — a genuine flat text-layer
    specimen, not an AcroForm and not a scanned image (every label, checkbox
    glyph, and dotted blank-line extracts as discrete, positioned text
    items).
  - The full page was rendered to PNG at 2.5x scale via `pdfjs-dist` +
    `node-canvas` (with `standardFontDataUrl` supplied) and visually
    cross-checked, in cropped sections, against the text-layer transcript.
    This confirmed: the exact reading order and cell boundaries of every
    field (several labels/blanks are ordered ambiguously by raw y-coordinate
    alone, e.g. the "Вярно/Невярно" checkbox pairs sit only 1-3pt above their
    associated blank line in several cells); that "Вх. номер" and "До" carry
    no printed blank/dotted entry line, unlike every other applicant-facing
    field (supporting their exclusion); and that the "от МВР" caption
    completes a fixed sentence ("... issued by MVR") rather than introducing
    its own blank.

## Extraction method

Text-layer extraction via `pdfjs-dist@3` (legacy build), reusing this
registry's established Node.js + `pdfjs-dist` render/extract technique. No
AcroForm widget correlation applies (zero Widget annotations on this
source) — field boundaries were read directly off the printed labels and
blank/dotted lines, cross-checked against a full-page render at 2.5x scale
(cropped into header/mid/bottom sections for close reading) to resolve
reading order and cell groupings that raw y-coordinate sorting alone left
ambiguous.

## Field derivation, by form section

- **Header.** "Вх. номер" (incoming/office reference number) and "До"
  (addressee) — both excluded (office-intake, no printed blank/dotted entry
  line, unlike every other field on the page). "Вид на услугата" (service
  type): three checkboxes — обикновена/бърза/ускорена (standard/fast/
  expedited) — modeled as a required `enum`.
- **Personal-data section.** The applicant's national ID number (ЕГН/ЛНЧ/ЛН,
  printed as a 10-box grid); date of birth; place of birth; full name in
  Cyrillic script (one line); full name in Latin/Roman transliteration (one
  line); family name and other/given names (a second, separately-labelled
  breakdown of the same name data, matching how a Bulgarian driving licence
  itself prints family name and given name(s) as separate MRZ-style fields —
  modeled as two additional fields rather than collapsed into the two
  full-name lines above, since the source prints all four as distinct
  blanks); address; sex (М/Ж checkboxes, modeled as a required enum); other
  nationality (for applicants holding a second nationality); a naturalization
  decree number ("Указ / Decree," for applicants who acquired Bulgarian
  citizenship by presidential decree); phone; email (the form's own printed
  note: an applicant who supplies an email is notified when the document is
  ready and before its validity expires); and the office where the finished
  licence should be collected ("Място на връчване / Place of receiving").
  **Six "Вярно/Невярно" (True/False) checkbox pairs** are printed adjacent to
  the national-ID, date-of-birth, place-of-birth, Cyrillic-name, Latin-name,
  and address fields respectively (re-confirmed by direct count against the
  rendered page — the prior cycle's own draft undercounted this at five;
  independently re-verified at six by both the raw text-extraction `y`
  positions and the visual render). The form's own explanatory paragraph
  ties these to a system-assisted, in-person counter workflow — "the
  application contains automatically filled current civil-status data from
  NBD 'Population' / via NAIF 'НРБЛД,' as well as a photo and signature from
  the last-issued Bulgarian personal document" — a different pathway from
  the plain paper-form completion this schema models (an agent filling in
  the blank specimen from scratch has no pre-filled registry data on this
  form to confirm or dispute). These six checkboxes are therefore treated as
  out of scope for this v1.0.0 rather than modeled as `fields[]` entries; see
  "Scoping and modeling judgment calls" below.
- **"Данни за упълномощено лице" (authorized-person/proxy) block.** The form's
  own instruction: "fill in only if the requested identity document(s) will
  be received by an authorized person." No printed boolean gate ties this
  block to an explicit condition, so all six of its fields (name, EGN,
  document type, authorization date, document number, and the applicant's
  own signature authorizing the proxy) are modeled as unconditionally
  optional rather than an invented `requiredWhen` gate, consistent with this
  registry's established convention for "fill in only if applicable"
  instructions with no explicit checkbox (e.g. `bg/mvnr`'s `guardianDetails`
  precedent).
- **Category-decline declaration.** "Декларирам, че се отказвам от
  придобита/и категория/и за правоуправление на МПС" (I declare that I
  renounce acquired driving-licence category/ies) — a free-text field for
  the category code(s) to decline, completed only when applicable.
- **Submission section.** The identity document presented at submission — a
  Bulgarian ID-card number for a citizen applicant, or a residence-permit
  number plus its issue date for a foreign-national applicant without a
  Bulgarian ID card (the source prints both as parallel blanks with no
  explicit toggle distinguishing which applies, so both are modeled as
  independently optional); the submission date; the applicant's (or
  submitting proxy's) printed name (preceding the identity-document row, tied
  to the form's own criminal-liability declaration under Art. 313 of the
  Penal Code); and the final applicant/proxy signature line.
- **Excluded as office-only.** "Имена на служителя, приел заявлението" /
  "Подпис на служителя" (the name/signature of the employee who received the
  application) — the form's own final row, consistent with this registry's
  established office-only-content exclusion convention (e.g. `rs/mup`,
  `rs/mfa`, `ro/dgpci`).

29 `fields[]` entries in total, plus 3 `documents[]` entries: the applicant
photograph ("Снимка 3,5/4,5," a 3.5×4.5cm photo box), a signature specimen
box (printed in the left margin, aligned with the place-of-birth row — this
is a physical signature specimen reproduced on the issued licence itself,
distinct from the typed-name `applicantSignature`/`authorizationSignature`
attestation fields), and the form's own printed criminal-liability
truthfulness declaration under Art. 313 of the Penal Code.

## Scoping and modeling judgment calls

- **The six "Вярно/Невярно" confirmation checkboxes are out of scope, not
  modeled as fields.** See "Field derivation" above. This is a judgment call,
  not a certainty: the form's own text does not explicitly label these
  boxes "for official use only" the way this registry's other office-only
  columns are labelled (e.g. `bg/mvnr`'s "Попълва се служебно" column,
  `ro/dgpci`'s "Caseta A"). The disclosure here is deliberately explicit
  about that ambiguity: the reasoning for exclusion is that these checkboxes
  presuppose a system-assisted counter workflow (pre-filled civil-registry
  data to confirm or dispute) that does not arise when independently filling
  in this blank specimen from scratch with fresh data, not a claim that they
  are unambiguously staff-only.
- **"Вх. номер" and "До" excluded.** Neither carries a printed blank/dotted
  entry line on the specimen, unlike every other applicant-facing field on
  the page — supporting treating both as office-intake/routing content
  rather than applicant-fillable fields, though (as with the confirmation
  checkboxes above) this is a disclosed judgment call rather than an
  explicit "office use only" label on the source.
- **Cyrillic/Latin full-name lines modeled alongside separate
  family-name/other-names fields.** The source prints all four as distinct
  blanks (two combined full-name lines, then a separate family-name/
  given-name(s) breakdown) rather than one superseding the other; both are
  modeled rather than assuming redundancy, since a Bulgarian driving licence
  itself prints family name and given name(s) separately (mirroring how this
  registry already separates surname/given-names fields on passport and visa
  schemas even when a combined name line also exists elsewhere on the same
  source).
- **Authorized-person (proxy) block fully optional, no invented gate.** See
  "Field derivation" above.
- **`idCardNumber`/`residencePermitNumber` both optional, no invented
  mutual-exclusivity gate.** The source prints no checkbox distinguishing
  which identity-document type applies; modeling one as `requiredWhen` the
  other is absent would require gating on field absence, which this
  registry's own established practice avoids (see the `notEquals`
  empty-string/absent-field gotcha already documented for this repo).
- **`serviceType`/`sex` modeled as `enum`, matching this registry's
  established convention** for a small, closed, mutually-exclusive printed
  checkbox set (e.g. `bg/mvnr`'s `travelDocumentType`/`maritalStatus`).
- **No `edition` axis.** A standing application form, not a dated annual
  filing.
- **`process.type` is `application`**, matching this registry's convention
  for first-issuance application forms.

## Conformance run

No PDF/AcroForm widget-count cross-check applies (zero fillable Widget
annotations on this source — confirmed above). In its place, two
hand-authored mock instances were built and checked against `schema.json`'s
own `required`/`requiredWhen`/`validation.enum`/`validation.maxLength`/
`validation.pattern` grammar with a disposable, from-scratch Python checker
(not committed, per this registry's established practice of not committing
one-off verification scripts):

- **`single-applicant-basic`** — a Bulgarian-citizen applicant, standard
  service tier, no proxy, no category declines, no second nationality.
  17 of 29 fields populated. **PASS.**
- **`proxy-collection-with-declines`** — the same applicant additionally
  exercising the full authorized-person (proxy) block, declining two
  categories (C1, C1E), and declaring a second nationality plus a
  naturalization-decree number. 27 of 29 fields populated. **PASS.**

Three mutation-control checks confirmed the checker actually enforces the
grammar rather than passing vacuously: dropping `nationalId` from the first
instance (unconditionally required — correctly flagged missing); setting
`sex` to an out-of-enum value (correctly flagged as an enum violation); and
dropping `submissionDate` (unconditionally required — correctly flagged
missing). Each mutation raised exactly its one expected error.

```
$ node tools/validate.mjs registry/bg/mvr/zayavlenie-za-izdavane-na-svidetelstvo-za-upravlenie-na-mps/1.0.0/schema.json
ok   registry/bg/mvr/zayavlenie-za-izdavane-na-svidetelstvo-za-upravlenie-na-mps/1.0.0/schema.json
1/1 document(s) passed.

$ node tools/validate-ajv.mjs registry/bg/mvr/zayavlenie-za-izdavane-na-svidetelstvo-za-upravlenie-na-mps/1.0.0/schema.json
ok   registry/bg/mvr/zayavlenie-za-izdavane-na-svidetelstvo-za-upravlenie-na-mps/1.0.0/schema.json [v0.3]
1/1 document(s) validated against the meta-schema (ajv 2020-12).
```

`tools/node_modules` did not exist in this worktree at the start of this
cycle; `npm ci --include=dev` installed `ajv`/`ajv-formats` cleanly with no
wipe. `pdfjs-dist`/`canvas` were reused from a pre-existing scratch
installation at `/tmp/pdfscratch` (outside the repo, left over from a prior
cycle's own verification work), so this cycle's own extraction tooling never
touched `tools/`'s committed dependency set.

`tools/govschema-client/registry-index.json` was regenerated via `npm run
build-index` inside `tools/govschema-client/` — see the diff in this PR for
the updated jurisdiction/document counts.

## Recovery note

A prior agent session's worktree for this same issue (GOV-2853) was found to
already contain a substantially-complete draft of this exact schema — same
source URL, same field structure, same 29/3 field/document counts — that had
never been committed (an infra-crash artifact, per this repo's own
established `EnterWorktree`/crash-recovery precedent). That draft was used as
the starting point for this cycle's schema.json rather than re-authored from
a blank slate, but every sourcing claim in it was independently re-verified
from scratch this cycle (fresh fetch via two methods, fresh sha256, fresh
`pdfjs-dist` extraction and page render), and one genuine defect was found
and fixed in the process: the draft's own description undercounted the
"Вярно/Невярно" checkbox pairs at five where a direct re-count (both from
raw text-extraction `y`-positions and the rendered page) confirms six.

## Scope and jurisdiction notes

- Opens Bulgaria's **DMV vertical** (3 of 6): Taxes (two schemas, GOV-2821),
  Visa (GOV-2830), DMV (this schema). Passport and National ID & Civic
  Documents remain open, unscreened Bulgaria backlog (National ID was
  spot-checked weak for the ID-card application specifically in GOV-2821;
  Passport is unscreened).
- `jurisdiction.level` is `national` — MVR is Bulgaria's national Ministry of
  Interior and sole driving-licence-issuing authority.
- `process.type` is `application`, matching this registry's convention for
  first-issuance application forms.
- `process.language` is `bg`: the modeled edition is the bilingual
  Bulgarian/English specimen (English appears throughout as a secondary
  in-line gloss on most labels, but the form itself is not published as a
  separate English-language edition).

## Re-verification

Per the practice's cadence, `nextReviewBy` is set to **2027-01-14** (6
months). A future review should prioritize: (1) confirming the source PDF
has not been superseded by a newer edition (this specimen's own numbering,
"Приложение № 2а," suggests it is one annex among several in MVR's
underlying regulation — a future review could confirm whether that
regulation has been amended); (2) whether Bulgaria's Passport vertical has a
genuine, unauthenticated, first-party source (unscreened this cycle); and
(3) re-attempting a targeted, browser-rendered fetch of the Registry
Agency's Business-Formation template portal (`portal.registryagency.bg`,
confirmed JavaScript-gated in GOV-2830) now that a driving-licence-specific
False lead has been resolved.
