Skip to content

The passport carries the operator's identifier but not the name and contact its cited basis requires #233

Description

@LKSNDRTMLKV

Passport::operator_identifier carries a pinned citation in its own doc comment:

Annex III, point (k) is the data-content basis — "the name, contact details and unique operator identifier of the economic operator established in the Union responsible for carrying out the tasks set out in Article 4 of Regulation (EU) 2019/1020 [...]"

The field is:

pub operator_identifier: Option<String>,

Three things are named in the basis. One is modelled. The name and the contact details have nowhere to live.

Why the manufacturer field does not cover it

ManufacturerInfo carries a name and an address, but the Art. 4 responsible operator is not necessarily the manufacturer — that is the point of the provision. For a product made outside the Union, the responsible operator is typically the importer or an authorised representative, and the passport currently has no way to say who that is, only an opaque identifier for them.

FacilitySnapshot does not cover it either: a facility is where the product was made, not who is answerable for it.

Why it is not urgent, and why it should still be filed

The identifier alone is enough for registry registration, which is the only consumer today, so nothing is broken. The gap shows up the first time a reader of a passport — a market surveillance authority, or anyone following Art. 4 — has to resolve the identifier to a contactable party out of band. The passport is supposed to carry that.

The design question, which is the actual work

Whether to add name and contact alongside the existing identifier, or to introduce a structured economic-operator type that carries all three plus a role, is not obvious and should be settled before any code:

  • A structured type with a role also answers "which of these operators is the responsible one" when there is more than one, which the single-field model cannot express at all. That is the shape the provision implies.
  • It also has to interact with TransferChain::current_operator(), which is already the authoritative record of who is responsible now. operator_identifier is deliberately frozen at publish and documented as such. Any new field has to declare which of the two it is, or it will be read as the wrong one.
  • Whatever lands is envelope, so it is additive-only, and it is signed content that a transfer cannot rewrite. Getting the frozen-versus-current distinction wrong here is not a bug that can be patched later.

Prerequisite

The citation above is marked confirmed against the verbatim OJ text, but it is a citation to a data-content requirement, not to a field shape. Before modelling, read Annex III point (k) and Art. 4 of 2019/1020 directly and establish what "contact details" is required to contain — a postal address, an email, a named person — because that determines whether this is one optional string or a struct.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions