Skip to content

bffi:* → MARCXML mapping reference

Background

This document describes the reverse-direction conversion: a BFFI canonical Turtle graph is read and a MARCXML record is reconstructed from it. For each MARC field the converter emits, the table below names the BFFI predicates that drive it, the MARC tag/indicators/subfields produced, and any known caveats.

The table is auto-generated from the converter source. If the table omits a MARC field, the converter does not produce it today.

What the converter reads — and what it does not

The reverse converter operates entirely from the published BFFI schema — the bffi: namespace plus rdf:type / rdf:value for structural dispatch and rdfs:label for human-readable text. Beyond those, it dispatches on closed LoC vocabularies that BFFI itself anchors on (id.loc.gov/vocabulary/ paths mnotetype/*, mstatus/*, menclvl/*, issuance/*, contentTypes/*, mediaTypes/*, carriers/*, languages/*, identifiers/*, relators/*, relationship/series, vartitletype/*). Any data outside that scope is invisible to the reconstruction by design: the round-trip verifies that the BFFI graph alone preserves enough information to reconstruct the source MARC. Pipeline-internal state (bffi-prov: provenance, processing audit trails, intermediate-stage annotations) is not consulted.

Field order and subfield order

The reconstruction's order is derived from the graph, not from the source record, and this is systematic rather than per-tag:

  • Repeated fields (multiple 650s, 700s, …) are emitted in the order the traversal yields them, which for subject and contributor families is effectively sorted by value — not the cataloguer's original sequence. RDF has no inherent statement order, so the source order is not preserved anywhere in the BFFI graph and cannot be recovered.
  • Subfields within a field follow the canonical order in this document's table, not the source's order. Where a cataloguer wrote $a $2 $0, the converter emits $a $0 $2.

The round-trip diff accounts for both: it pairs repeated fields by content instead of by position, and reports a field whose subfields differ only in order as reordered rather than changed. Instance order is deliberately not compared — see plans/p-063-diff-pairing.md.

Reading the table

The first column is the MARC tag (or leader for the record-level pseudo-tag). The Ind1 / Ind2 column shows the indicators the converter writes; # represents the MARC blank indicator (a literal space in MARCXML); indicates a control field or leader with no indicators. The BFFI source column names the predicates the converter walks. The Notes table flags caveats.

MARC fields the converter emits

MARC tag Ind1 / Ind2 Subfields BFFI source
leader Position 05 ← bffi:adminMetadata / bffi:status (mstatus URI); position 06 ← bffi:content URI's last segment (txt → 'a' etc.); position 07 ← bffi:issuance URI (mono → 'm', serl → 's', …); position 17 ← bffi:encodingLevel (menclvl/7 → '7', menclvl/f → ' ').
001 ?m bffi:identifiedBy [a bffi:Local ; rdf:value ?bib_id] (fallback: parse from the Manifestation URI fragment)
005 ?m bffi:adminMetadata [a bffi:AdminMetadata ; bffi:changeDate ?date]
010 ## $a — LCCN value ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/lccn ; rdf:value ?value]
015 ## $a — national bibliography number ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/nbn ; rdf:value ?value]
016 ## $a — national bibliographic agency control number ?m bffi:identifiedBy [a bffi:Identifier ; bffi:marcKey ?key ; rdf:value ?value] where the first 3 chars of ?key are '016' — marcKey-driven recovery, needed because 016 and non-OCoLC 035 both forward to bffi:source <…/identifiers/local> and aren't distinguishable from source alone.
017 ## $a — copyright / legal-deposit number
$b — assigning agency
?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/copyright-number ; rdf:value ?value ; bffi:assigner [a bffi:Organization ; rdfs:label ?name]]
020 ## $a — ISBN value
$q — qualifier (binding / format, e.g. 'nid.', 'pehmeäkantinen')
?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/isbn ; rdf:value ?isbn ; bffi:qualifier ?qualifier]
022 ## $a — ISSN value ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/issn ; rdf:value ?issn]
023 ## $a — batch group number (ISSN-L) ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/issn-l ; rdf:value ?value]
024 0-3# $a — EAN / UPC / ISMN value
$q — qualifier (binding / format, e.g. 'pelipakkaus')
?m bffi:identifiedBy [a bffi:Identifier ; bffi:source <…/identifiers/upc | ismn | ean> ; rdf:value ?value ; bffi:qualifier ?qualifier] — ind1 selects the scheme (1=UPC, 2=ISMN, 3=EAN).
025 ## $a — overseas acquisition number ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/lc-overseas-acq ; rdf:value ?value]
026 ## $a — fingerprint identifier ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/fingerprint ; rdf:value ?value]
027 ## $a — standard technical report number ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/strn ; rdf:value ?value]
028 0-60-3 $a — publisher / distributor number value
$b — issuing publisher / distributor name
$q — qualifier (binding / format)
?m bffi:identifiedBy [a bffi:Identifier ; bffi:source <…/identifiers/audio-issue-number> ; rdf:value ?value ; bffi:assigner [a bffi:Organization ; rdfs:label ?name] ; bffi:qualifier ?qualifier] — ind1=0 for audio issue numbers; ind2=1 = note maker / no added entry (the HELMET corpus default).
030 ## $a — CODEN designation ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/coden ; rdf:value ?value]
032 ## $a — postal registration number
$b — registering agency
?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/postal-registration ; rdf:value ?value ; bffi:assigner [a bffi:Organization ; rdfs:label ?name]]
035 ## $a — OCLC / system control number OCoLC variant: ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/oclc-number ; rdf:value ?value]. Other agencies: ?m bffi:identifiedBy [a bffi:Local ; bffi:assigner <…/organizations/{code}> ; rdf:value ?number] — \$a is recomposed as (AGENCY)number.
037 ## $a — stock number
$b — imprint
$c — acquisition terms (place / mode of acquisition)
$f — other physical details
$g — dimensions
$n — copies held
?m bffi:acquisitionSource [a bffi:AcquisitionSource ; bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/stock-number ; rdf:value ?stock] ; rdfs:label ?imprint ; bffi:acquisitionTerms ?terms] — $f / $g / $n come from bffi:note [a bffi:Note ; rdfs:label ?text] on the same bnode; the first note is $3 (intervening-source / current-source text from MARC ind1), the rest are $f / $g / $n in source order.
040 ## $b — language of cataloguing (bffi:descriptionLanguage)
$e — description conventions (bffi:descriptionConventions)
?am a bffi:AdminMetadata ; bffi:descriptionLanguage ?lang . $b = local name of ?lang ; $e = local name of each ?am bffi:descriptionConventions.
041 ## $a — 3-letter language code (one per language)
$h — language of the original
$i — language of intertitles
$j — language of subtitles
$k — language of intermediate translations
$m — language of accompanying material
$n — language of the original libretto
$p — language of captions
$q — language of accessible audio
$r — language of accessible visual language
\$a: ?m or ?work or ?expression bffi:language http://id.loc.gov/vocabulary/languages/{code} — the last URI segment is the MARC code. \$h and the other component codes: ?work bffi:note [a http://id.loc.gov/vocabulary/resourceComponents/{component} ; bffi:language <…/languages/{code}>], where the component URI selects the subfield (otx → \$h, sub → \$j, …)
042 ## $a — authentication code ?m bffi:DescriptionAuthentication http://id.loc.gov/vocabulary/marcauthen/{code} — URI reference with marcauthen vocabulary. The URI local name is the MARC code.
043 ## $a — geographic area code identifier ?w bffi:geographicCoverage — URI reference on the same predicate as 522 bnode discriminates 043 from 522. The URI is ``http://id.loc.gov/vocabulary/geographicAreas/{code}.
045 ## $a — time period code
$b — additional time period information
?w bffi:temporalCoverage ?literal (plain EDTF string) — no discriminator needed, bffi:temporalCoverage is unique to MARC 045.
046 ## $k — origin date
$l — valid date
$m — death date
$n — birth date
?w bffi:originDate ?k / bffi:validDate ?l (EDTF literals). Each literal becomes one MARC 046 subfield; $m and $n are not produced by the XSLT (no bf:deathDate/bf:birthDate templates).
050 ## $a — classification number
$2 — scheme code (e.g. 'ykl'); only when bffi:source present
?work bffi:classification [a bffi:ClassificationLcc ; bffi:classificationPortion ?n]
060 ## $a — classification number
$2 — scheme code (e.g. 'ykl'); only when bffi:source present
?work bffi:classification [a bffi:ClassificationNlm ; bffi:classificationPortion ?n]
070 ## $a — classification number
$2 — scheme code (e.g. 'ykl'); only when bffi:source present
?work bffi:classification [a bffi:ClassificationNal ; bffi:classificationPortion ?n]
074 ## $a — GPO item number ?m bffi:identifiedBy [a bffi:Identifier ; bffi:marcKey ?key ; rdf:value ?value] where the first 3 chars of ?key are '074' — marcKey-driven recovery, needed because 074 emits a bare bf:Identifier (no source URI).
080 ## $a — classification number
$2 — scheme code (e.g. 'ykl'); only when bffi:source present
?work bffi:classification [a bffi:ClassificationUdc ; bffi:classificationPortion ?n]
082 ## $a — classification number
$2 — scheme code (e.g. 'ykl'); only when bffi:source present
?work bffi:classification [a bffi:ClassificationDdc ; bffi:classificationPortion ?n]
084 ## $a — classification number
$2 — scheme code (e.g. 'ykl'); only when bffi:source present
?m bffi:workManifested ?work . ?work bffi:classification [a bffi:Classification ; bffi:classificationPortion ?number ; bffi:source [a bffi:Source ; bffi:code ?code]] — the catch-all for plain bffi:Classification blocks; subclassed UDC / DDC / LCC / NLM / NAL classifications dispatch to 080 / 082 / 050 / 060 / 070.
086 ## $a — classification number
$2 — scheme code (e.g. 'ykl'); only when bffi:source present
?m bffi:workManifested ?work . ?work bffi:classification [a bffi:Classification ; bffi:classificationPortion ?number ; bffi:source [a bffi:Source ; bffi:code 'gpo']] — Government Document Classification. Plain bffi:Classification with bffi:source URI ending in /classifications/gpo dispatches to 086 instead of the 084 catch-all.
088 ## $a — report number ?m bffi:identifiedBy [a bffi:Identifier ; bffi:source http://id.loc.gov/vocabulary/identifiers/report-number ; rdf:value ?value]
100 ## $a — personal / corporate / meeting name
$b — subordinate unit (corporate / meeting; marcKey-driven)
$c — qualifier (e.g. fictional-character flag; marcKey-driven)
$d — dates of birth / death / activity (marcKey-driven)
$e — relator term (cataloguer's free-text role, e.g. 'näyttelijä')
$g — miscellaneous information (marcKey-driven)
$t — title within work — analytical added entry (marcKey-driven)
$0 — authority URI (marcKey-driven)
$4 — LoC relator code (e.g. 'aut')
?m bffi:workManifested ?work . ?work bffi:contribution [a bffi:PrimaryContribution ; bffi:agent ?agent ; bffi:role ?role] . ?agent a bffi:Person ; rdfs:label ?name . $4 = local-name of ?role when ?role is a LoC relator URI; $e = rdfs:label of ?role when ?role is a bnode with a label.
110 ## $a — personal / corporate / meeting name
$b — subordinate unit (corporate / meeting; marcKey-driven)
$c — qualifier (e.g. fictional-character flag; marcKey-driven)
$d — dates of birth / death / activity (marcKey-driven)
$e — relator term (cataloguer's free-text role, e.g. 'näyttelijä')
$g — miscellaneous information (marcKey-driven)
$t — title within work — analytical added entry (marcKey-driven)
$0 — authority URI (marcKey-driven)
$4 — LoC relator code (e.g. 'aut')
Same as 100, but with ?agent a bffi:Organization (or bffi:Jurisdiction) on a primary contribution
111 ## $a — personal / corporate / meeting name
$b — subordinate unit (corporate / meeting; marcKey-driven)
$c — qualifier (e.g. fictional-character flag; marcKey-driven)
$d — dates of birth / death / activity (marcKey-driven)
$e — relator term (cataloguer's free-text role, e.g. 'näyttelijä')
$g — miscellaneous information (marcKey-driven)
$t — title within work — analytical added entry (marcKey-driven)
$0 — authority URI (marcKey-driven)
$4 — LoC relator code (e.g. 'aut')
Same as 100, but with ?agent a bffi:Meeting on a primary contribution
130 0# $a — uniform title — main entry
$d — date of treaty signing (marcKey-driven)
$g — miscellaneous information (marcKey-driven)
$l — language of a work (marcKey-driven)
$n — number of part / section (marcKey-driven)
$p — name of part / section (marcKey-driven)
?m bffi:expressionOf ?hub . ?hub URI fragment matches '#Hub130'; ?hub bffi:marcKey ?key (begins with '130'). Indicators and every subfield parsed verbatim — same marcKey-driven recovery as 730/740.
210 1# $a — abbreviated title ?m bffi:title ?t . ?t a bffi:Title ; bffi:marcKey ?key (begins with '210') ; bffi:mainTitle ?text — forward direction collapses bf:AbbreviatedTitle into bffi:Title; the source tag survives only on bffi:marcKey.
222 ## $a — key title ?m bffi:title ?t . ?t a bffi:Title ; bffi:marcKey ?key (begins with '222') ; bffi:mainTitle ?text — bf:KeyTitle collapses to bffi:Title via the title-variant routing.
240 10 $a — uniform title (Manifestation-anchored variant)
$g — miscellaneous information (marcKey-driven)
$l — language of a work (marcKey-driven)
$n — number of part / section (marcKey-driven)
$p — name of part / section (marcKey-driven)
$s — version (marcKey-driven)
?m bffi:expressionOf ?hub (?hub URI fragment matches '#Hub240'). ?hub bffi:contribution / bffi:agent / bffi:marcKey carries the source 240's subfields as $t/$l/$g/$p/$s/$n/$k extras alongside the 1XX contributor; the reconstruction parses those and remaps $t → 240 $a.
242 10 $a — translation of title by cataloguing agency ?m bffi:title ?t . either (?t rdf:type <…/vartitletype/tra>) or (?t bffi:marcKey ?key beginning with '242') ; bffi:mainTitle ?text
243 10 $a — collective uniform title ?m bffi:title ?t . ?t a bffi:Title ; bffi:marcKey ?key (begins with '243') ; bffi:mainTitle ?text — bf:CollectiveTitle collapses to bffi:Title via the title-variant routing.
245 00 $a — main title
$b — subtitle
$c — statement of responsibility
$n — number of part / section of a work
$p — name of part / section of a work
?m bffi:title / bffi:Title / bffi:mainTitle (mandatory) + bffi:subtitle / bffi:partNumber / bffi:partName (each optional); responsibility comes from ?m bffi:responsibilityStatement
246 1# $a — variant title ?m bffi:title ?t . either (?t rdf:type <…/vartitletype/{por,dis,cov,atp,cap,run,spi}>) or (?t bffi:marcKey ?key beginning with '246') ; bffi:mainTitle ?text
247 10 $a — former title ?m bffi:title ?t . either (?t rdf:type <…/vartitletype/for>) or (?t bffi:marcKey ?key beginning with '247') ; bffi:mainTitle ?text
250 ## $a — edition statement ?m bffi:editionStatement ?text
257 ## $a — producing or filming place
$2 — source code (local part of the place's bffi:source)
?i bffi:originPlace ?place — bnode on the bf:Instance, not the bf:Work (which carries 370). ?place a bffi:Place ; rdfs:label ?a ; [bffi:source [bffi:code ?2]]? .
260 ## $a — place of publication / distribution
$b — publisher / distributor name
$c — date of publication / distribution
?m bffi:provisionActivity ?pa . ?pa a bffi:Publication ; bffi:simplePlace ?place ; bffi:simpleAgent ?agent ; bffi:simpleDate ?date . Fallback: ?m bffi:publicationStatement ?text — emits in $a as a single flat string when the structured parts are absent.
300 ## $a — extent
$b — other physical details (illustrations, colour, etc.)
$c — dimensions
$e — accompanying material
?m bffi:extent / bffi:Extent / rdfs:label (for $a); the Extent's bffi:note typed <…/mnotetype/physical> (for $b); ?m bffi:dimensions literal (for $c); ?m bffi:note typed <…/mnotetype/accmat> (for $e)
306 ## $a — playing time (HHMMSS) ?m bffi:duration ?literal — the duration literal is emitted verbatim into $a. marc2bibframe2 stores it as a plain string literal under bf:duration.
310 ## $a — current publication frequency ?m bffi:frequency [a bffi:Frequency ; rdfs:label ?text] — with NO bffi:status (or status not in the former-status set). Bnodes typed with bffi:status <…/mstatus/former> emit as 321 instead.
321 ## $a — former publication frequency ?m bffi:frequency [a bffi:Frequency ; bffi:status ?s ; rdfs:label ?text] where ?s is a member of the former-status URI set (<…/mstatus/former>).
334 ## $a — mode of issuance term ?m bffi:issuance [a bffi:Issuance ; rdfs:label ?text] — marc2bibframe2 emits bf:issuance with a bf:Issuance bnode carrying the controlled vocabulary label.
336 ## $a — term in the cataloguing language (rdfs:label of the URI)
$b — RDA 3-letter code (URI last segment)
$2 — scheme name (rdacontent / rdamedia / rdacarrier)
$3 — materials specified (from bffi:appliesTo/rdfs:label)
?m bffi:workManifested ?work . ?expression bffi:expressionOf ?work (or ?expression bffi:manifestationOfExpression ?m) . ?expression bffi:content http://id.loc.gov/vocabulary/contentTypes/{code} . ?content bffi:appliesTo ?applies . ?applies rdfs:label ?applies_to . $a = ?content's rdfs:label; $b = {code}; $2 = 'rdacontent'; $3 = ?applies_to.
337 ## $a — term in the cataloguing language (rdfs:label of the URI)
$b — RDA 3-letter code (URI last segment)
$2 — scheme name (rdacontent / rdamedia / rdacarrier)
$3 — materials specified (from bffi:appliesTo/rdfs:label)
?m bffi:media http://id.loc.gov/vocabulary/mediaTypes/{code} . ?media bffi:appliesTo ?applies . ?applies rdfs:label ?applies_to . $a from rdfs:label; $b = {code}; $2 = 'rdamedia'; $3 = ?applies_to.
338 ## $a — term in the cataloguing language (rdfs:label of the URI)
$b — RDA 3-letter code (URI last segment)
$2 — scheme name (rdacontent / rdamedia / rdacarrier)
$3 — materials specified (from bffi:appliesTo/rdfs:label)
?m bffi:carrier http://id.loc.gov/vocabulary/carriers/{code} . ?carrier bffi:appliesTo ?applies . ?applies rdfs:label ?applies_to . $a from rdfs:label; $b = {code}; $2 = 'rdacarrier'; $3 = ?applies_to.
351 ## $a — classification/call number
$b — unit ID
$c — general group designation
$3 — materials specified
?m bffi:collectionArrangement [a bffi:CollectionArrangement ; rdfs:label ?a] — unique predicate, no discriminator needed.
352 ## $a — original use of title (literal)
$b — other title information (literal)
$q — file format (literal)
$6 — occurrence identifier (literal)
?m bffi:digitalCharacteristic [a bffi:CartographicDataType ; rdfs:label ?a] — unique predicate, no discriminator needed.
353 ## $a — content of the work (e.g. 'index', 'biographical information')
$b — level of analysis (absorbed into $0 when not a URI)
$0 — authority record control number or URI
$2 — source of heading or code
?work bffi:supplementaryContent [a bffi:SupplementaryContent ; rdfs:label ?content ; bffi:identifiedBy [rdf:value ?authority] ; bffi:source [a bffi:Source ; bffi:code ?scheme]] — $0 is the identifier value (URI or bare string); $2 is the source scheme code.
370 ## $g — associated place term (rdfs:label of the place node)
$2 — source vocabulary code (local part of the place's bffi:source)
?m bffi:workManifested ?work . ?work bffi:originPlace ?place . ?place a bffi:Place ; rdfs:label ?g . $2 = the scheme code of ?place's bffi:source when present.
384 ## $a — key
$3 — materials specified
?w bffi:musicKey ?literal (plain literal) — single literal value.
490 0# $a — untraced series statement
$v — volume number
?work bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/series> ; bffi:associatedResource ?s ; bffi:seriesEnumeration ?vol] . ?s a bffi:SeriesExpression ; bffi:status <…/mstatus/t> ; NOT EXISTS { ?s bffi:status <…/mstatus/tr> } . ?s bffi:title / bffi:mainTitle ?text — $v from the Relation's bffi:seriesEnumeration when present.
500 ## $a — general note text ?m or ?work bffi:note [a bffi:Note ; rdfs:label ?text] — note bnode with NO mnotetype rdf:type (the catch-all 5XX).
501 ## $a — general note text (marcKey-driven recovery of 501) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '501'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 501; the original tag survives only on the marcKey carrier.
502 ## $a — dissertation note text ?m bffi:dissertation [a bffi:Dissertation ; rdfs:label ?text]
504 ## $a — bibliography note text ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/biblio> ; rdfs:label ?text] — typed with the bibliography tail.
505 0# $a — formatted contents note ?m bffi:tableOfContents [a bffi:TableOfContents ; rdfs:label ?text]
506 ## $a — terms governing access — note text ?m bffi:usageAndAccessPolicy [a bffi:AccessPolicy ; rdfs:label ?text]
507 ## $a — scale note text ?w bffi:scale [a bffi:Scale ; rdfs:label ?text]
511 ## $a — participants / performers note text ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/participants> ; rdfs:label ?text] — typed with the participants tail. Participants notes hang off the Work, not the Manifestation.
513 ## $a — general note text (marcKey-driven recovery of 513) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '513'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 513; the original tag survives only on the marcKey carrier.
515 ## $a — general note text (marcKey-driven recovery of 515) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '515'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 515; the original tag survives only on the marcKey carrier.
516 ## $a — general note text (marcKey-driven recovery of 516) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '516'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 516; the original tag survives only on the marcKey carrier.
518 ## $a — date / time / place of event note (flattened Capture label)
$o — other event information (structured Capture: bffi:note)
$d — date of event (structured Capture: bffi:date)
$p — place of event (structured Capture: bffi:place)
$3 — materials specified (structured Capture: bffi:appliesTo)
?m or ?work bffi:capture ?c . ?c a bffi:Capture . Two shapes: when ?c carries an rdfs:label the whole field emits as \$a; when it carries none, \$o / \$d / \$p / \$3 are read from ?c's bffi:note / bffi:date / bffi:place / bffi:appliesTo.
520 ## $a — summary note text ?m bffi:summary [a bffi:Summary ; rdfs:label ?text]
521 ## $a — intended audience note ?m bffi:intendedAudience [a bffi:IntendedAudience ; rdfs:label ?text]
522 ## $a — geographic coverage note ?w bffi:geographicCoverage [a bffi:GeographicCoverage ; rdfs:label ?text] — bnode-with-class object discriminates 522 from 043 (which uses a literal code on the same predicate).
524 ## $a — preferred citation of described materials ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/citeas> ; rdfs:label ?text]
525 ## $a — supplement note text ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/suppl> ; rdfs:label ?text]
530 ## $a — additional physical form available note ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/addphys> ; rdfs:label ?text]
532 ## $a — accessibility note text ?m bffi:contentAccessibility [a bffi:ContentAccessibility ; rdfs:label ?text]
533 ## $a — general note text (marcKey-driven recovery of 533) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '533'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 533; the original tag survives only on the marcKey carrier.
534 ## $c — publication / distribution of original ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/orig> ; rdfs:label ?text] — note typed with the original-version tail.
536 ## $a — general note text (marcKey-driven recovery of 536) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '536'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 536; the original tag survives only on the marcKey carrier.
538 ## $a — system details note text ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/computer> ; rdfs:label ?text] — typed with the computer tail.
540 ## $a — terms governing use and reproduction — note text ?m bffi:usageAndAccessPolicy [a bffi:UsePolicy ; rdfs:label ?text]
541 ## $a — immediate source of acquisition note ?m bffi:immediateAcquisition [a bffi:ImmediateAcquisition ; rdfs:label ?text]
544 ## $a — general note text (marcKey-driven recovery of 544) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '544'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 544; the original tag survives only on the marcKey carrier.
545 ## $a — general note text (marcKey-driven recovery of 545) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '545'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 545; the original tag survives only on the marcKey carrier.
546 ## $a — language note text ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/lang> ; rdfs:label ?text] — note typed with the language tail.
547 ## $a — general note text (marcKey-driven recovery of 547) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '547'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 547; the original tag survives only on the marcKey carrier.
550 ## $a — general note text (marcKey-driven recovery of 550) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '550'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 550; the original tag survives only on the marcKey carrier.
555 ## $a — general note text (marcKey-driven recovery of 555) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '555'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 555; the original tag survives only on the marcKey carrier.
556 ## $a — general note text (marcKey-driven recovery of 556) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '556'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 556; the original tag survives only on the marcKey carrier.
561 ## $a — ownership / custodial history ?m bffi:custodialHistory ?text (literal-valued predicate — no bnode wrapper, mirroring BIBFRAME's bf:custodialHistory)
563 ## $a — binding information note ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/binding> ; rdfs:label ?text]
580 ## $a — linking entry complexity note ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/relnote> ; rdfs:label ?text]
581 ## $a — general note text (marcKey-driven recovery of 581) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '581'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 581; the original tag survives only on the marcKey carrier.
583 ## $a — preservation / action note ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/action> ; rdfs:label ?text]
585 ## $a — general note text (marcKey-driven recovery of 585) ?m or ?work bffi:note [a bffi:Note ; bffi:marcKey ?key ; rdfs:label ?text] where the first 3 chars of ?key are '585'. marc2bibframe2 emits a bare bf:Note (no mnotetype tail) for 585; the original tag survives only on the marcKey carrier.
586 ## $a — awards note text ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/award> ; rdfs:label ?text]
587 ## $a — description-based note (source not formalised) ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/datasource> ; rdfs:label ?text] — marc2bibframe2 attaches mnotetype/datasource when MARC ind1=' '. A separate entry exists for mnotetype/datanf which emits with ind1='0'.
588 ## $a — source of description note ?m or ?work bffi:note [a bffi:Note, <…/mnotetype/descsource> ; rdfs:label ?text]
600 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Person
610 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Organization
611 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Meeting
630 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Title
647 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Event
648 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Temporal
650 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Topic
651 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Place
653 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Uncontrolled (any term-kind, anonymous bnode in BFFI)
655 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:GenreForm
662 ## $a — subject heading / term
$c — qualifier (marcKey-driven)
$d — dates (marcKey-driven)
$t — title within name-title subject (marcKey-driven, e.g. 600 ind2=4)
$0 — authority URI for the subject heading
$2 — source vocabulary code (e.g. 'yso', 'ysa', 'slm')
?m bffi:workManifested ?work . ?work bffi:subject | bffi:genreForm ?subject . ?subject rdfs:label ?label . $2 = local-name of ?subject's bffi:source URI when present; $0 = ?subject URI itself when it's not a bib-internal mint — ?subject is typed bffi:Place AND its URI fragment matches #Place662-N (the marc2bibframe2 mint pattern for hierarchical-place-name subjects from MARC 662, distinct from 651's #Place651-N).
700 ## $a — personal / corporate / meeting name
$b — subordinate unit (corporate / meeting; marcKey-driven)
$c — qualifier (e.g. fictional-character flag; marcKey-driven)
$d — dates of birth / death / activity (marcKey-driven)
$e — relator term (cataloguer's free-text role, e.g. 'näyttelijä')
$g — miscellaneous information (marcKey-driven)
$t — title within work — analytical added entry (marcKey-driven)
$0 — authority URI (marcKey-driven)
$4 — LoC relator code (e.g. 'aut')
Same chain as 100, but the contribution is NOT typed bffi:PrimaryContribution — added-entry contributors land in 7XX
710 ## $a — personal / corporate / meeting name
$b — subordinate unit (corporate / meeting; marcKey-driven)
$c — qualifier (e.g. fictional-character flag; marcKey-driven)
$d — dates of birth / death / activity (marcKey-driven)
$e — relator term (cataloguer's free-text role, e.g. 'näyttelijä')
$g — miscellaneous information (marcKey-driven)
$t — title within work — analytical added entry (marcKey-driven)
$0 — authority URI (marcKey-driven)
$4 — LoC relator code (e.g. 'aut')
Same as 700, but with ?agent a bffi:Organization or bffi:Jurisdiction
711 ## $a — personal / corporate / meeting name
$b — subordinate unit (corporate / meeting; marcKey-driven)
$c — qualifier (e.g. fictional-character flag; marcKey-driven)
$d — dates of birth / death / activity (marcKey-driven)
$e — relator term (cataloguer's free-text role, e.g. 'näyttelijä')
$g — miscellaneous information (marcKey-driven)
$t — title within work — analytical added entry (marcKey-driven)
$0 — authority URI (marcKey-driven)
$4 — LoC relator code (e.g. 'aut')
Same as 700, but with ?agent a bffi:Meeting
730 0# $a — uniform title heading
$g — miscellaneous information
$i — relationship information (marcKey-driven)
$l — language of a work
$n — number of part / section of a work
$o — arrangement statement for music
$p — name of part / section of a work
$s — version (marcKey-driven)
?m bffi:relation [bffi:associatedResource ?target] . ?target bffi:marcKey ?key (where ?key begins with '730') . All subfields and indicators are read verbatim from ?key.
740 0# $a — added analytical title
$n — number of part / section
$p — name of part / section
Same chain as 730 but with bffi:marcKey beginning with '740'
762 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/subseries> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
765 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/translationof> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
767 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/translatedas> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
770 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/supplement> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
772 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/supplementto> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
773 0# $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/partof> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
774 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/part> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
775 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/otheredition> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
776 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/otherphysicalformat> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
777 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/issuedwith> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
786 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/datasource> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
787 ## $a — main entry heading of the related resource
$t — title of the related resource
$w — control number of the related resource (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/relatedwork> ; bffi:associatedResource ?related] . Either ?related bffi:marcKey ?key (preferred — emits full subfield set and indicators) or ?related rdfs:label ?a + bffi:title / bffi:Title / bffi:mainTitle ?t (fallback).
800 1# $a — personal-name series statement
$t — title (marcKey-driven)
$v — volume number (marcKey-driven)
?source bffi:relation [bffi:relationship <…/relationship/series> ; bffi:associatedResource ?hub] . ?hub bffi:marcKey ?key (where ?key begins with '800')
810 2# $a — corporate-name series statement
$b — subordinate unit (marcKey-driven)
$t — title (marcKey-driven)
$v — volume number (marcKey-driven)
$n — number of part (marcKey-driven)
?source bffi:relation [bffi:relationship <…/relationship/series> ; bffi:associatedResource ?hub] . ?hub bffi:marcKey ?key (where ?key begins with '810')
811 2# $a — meeting-name series statement
$t — title (marcKey-driven)
$v — volume number (marcKey-driven)
?source bffi:relation [bffi:relationship <…/relationship/series> ; bffi:associatedResource ?hub] . ?hub bffi:marcKey ?key (where ?key begins with '811')
830 ## $a — uniform-title series statement
$n — number of part / section (marcKey-driven)
$v — volume number (marcKey-driven)
?source bffi:relation [a bffi:Relation ; bffi:relationship <…/relationship/series> ; bffi:associatedResource ?hub] . ?hub a bffi:SeriesExpression ; bffi:marcKey ?key (where ?key begins with '830') — full subfield set parsed from marcKey verbatim.
856 40 $u — URI to the electronic resource ?m bffi:electronicLocator ?url — each URI object emits as one MARC 856 datafield with $u carrying the URL string. Indicators default to ind1=4 (HTTP) ind2=0 (Resource) per HELMET corpus convention.
880 ## $6 — linkage to main field: {main_tag}-{occurrence}/{script_indicator}
$a — alt-script value (language-tagged duplicate on main field predicates)
Derived from language-tagged duplicates detected on the main field's BFFI predicates (e.g. agent rdfs:label, title bffi:mainTitle, etc.). One 880 per alt-script value, with occurrence-numbered $6 linkage.

138 MARC tags currently emitted.

Per-tag notes

Tags whose mapping carries a caveat worth flagging — known limitations, fallback paths, or marcKey-driven recovery patterns. Tags whose row in the table above is self-explanatory are omitted.

MARC tag Notes
leader Other leader positions hold structural constants (10/11 = '2', 20-23 = '4500') or placeholders (00-04 record length, 12-16 base address — recomputed by downstream MARC binary writers). Source-MARC byte-fidelity is not guaranteed because BFFI doesn't preserve every leader byte (e.g. position 09 character coding).
016 Dormant until the BIBFRAME → BFFI direction attaches bffi:marcKey to bf:Identifier bnodes. The clean-source path is not viable: 016 forwards to bf:Local, sharing the source URI with non-OCoLC 035.
017 MARC 017 source carries a date in \$d that marc2bibframe2 stores on the bf:Identifier as bf:date. The reverse path does not yet round-trip this — only \$a and \$b are emitted.
023 MARC 023 carries the ISSN-L (International Standard Serial Number Leader) batch group number. marc2bibframe2 emits bf:IssnL when ind1=0; the forward routing collapses it to bffi:Identifier with bffi:source …/identifiers/issn-l. The reverse path reads this and emits MARC 023 \$a with the bare value.
026 MARC 026 carries a fingerprint identifier (a unique character string derived from the record's control fields and datafields). marc2bibframe2 emits bf:Fingerprintbffi:Identifier with bffi:source …/identifiers/fingerprint. The reverse path reads this and emits MARC 026 \$a with the bare value.
035 Both variants round-trip. The non-OCoLC shape carries no bffi:source and no marcKey — an earlier note claimed it shared <…/identifiers/local> with MARC 016 and needed a marcKey to disambiguate, which the data does not bear out. The assigner organization URI is the discriminator; the record's own 001-bound bib ID is also bffi:Local but carries no assigner. The agency code is restored from a small organization-code map because the LoC URI drops the hyphen (FI-BTJ → fibtj) and no generic rule can put it back — DLC must stay DLC. Unknown codes fall back to bare uppercase, which keeps the number and loses only the hyphenation. MARC 016 / 074 share this shape and are dispatched first by marcKey; 016s without a marcKey would be emitted here as 035.
037 The $3 subfield is only emitted when a note is present on the BFFI bnode — marc2bibframe2 only produces it when ind1 is 2 or 3 in the source MARC. $f / $g / $n are emitted in source order when three or more notes are present; fewer notes produce fewer subfields.
040 \$a and \$d are not recoverable. The vendored marc2bibframe2 v3.1.0 comments out both the \$a → bf:assigner and \$d → bf:descriptionModifier blocks in its 040 template (ConvSpec-010-048.xsl), so the cataloguing-agency codes never reach BIBFRAME and cannot be reconstructed from BFFI. Emitting an agency guessed from some other assigner in the graph produced the wrong one for 185 of 190 records on the reference corpus — a false provenance claim — so only \$b and \$e are emitted.

bffi:descriptionLanguage gates the emit: it is the one property that comes only from 040 \$b. Keying on descriptionConventions instead fabricated a 040 for 46 records that never had one, because marc2bibframe2 also derives aacr from leader/18.

\$e can gain a value the source lacked: isbd is asserted alongside the record's own conventions.
041 The sub-language codes do survive the forward hop — an earlier note here claimed they collapse into flat bffi:language URIs, and that is wrong. ConvSpec-010-048.xsl's parse041 wraps every subfield in the hijkmnpqr set in a bf:Note typed with a resourceComponents URI carrying the language inside, so the sub-code is recoverable: \$h (otx) is emitted from bffi:note [a <…/resourceComponents/otx> ; bffi:language ?lang], and likewise \$i \$j \$k \$m \$n \$p \$q \$r. 26 source \$h and 10 \$j occurrences in the fixture corpus; 9 records' 041s became byte-identical when this landed.

Not recovered: the bdefgt set (\$b summary, \$d sung or spoken text, \$e librettos, \$f table of contents, \$g accompanying material, \$t transcripts), which the XSLT emits as bf:accompaniedBybf:Work instead — a different shape this path doesn't walk (one \$d in the corpus). A source \$3 (materials specified) makes the XSLT drop the language outright, so those are unrecoverable at any stage.

ind1=1 is asserted when \$h is present (all 26 corpus \$h carriers use ind1=1); the XSLT comments out its own ind1 handling, so ind1 is otherwise absent from BIBFRAME and stays blank rather than claiming '0' (not a translation) without evidence.

\$a order is not preserved — the codes come from an unordered RDF set and are emitted sorted, so a source whose first \$a marks the predominant language loses that distinction. mul and zxx are dropped from \$a when other codes are present: they are 008/35-37 summary codes that leaked in as an extra \$a, and in the corpus they appear in a source 041 only alone.

Emitted whenever the graph carries a language statement, so a record whose language came only from 008 (no source 041) gains one — visible as added in the round-trip diff. Suppressing single-language 041s would remove ~31 such additions on the reference corpus but lose the 95 source 041s that are legitimately a single \$a matching 008/35-37.
042 Plain URI reference emit. The XSLT produces bf:authentication with a marcauthen vocabulary URI; the BFFI routing renames it to bffi:DescriptionAuthentication. The URI's local name is the MARC authentication code (e.g. fdo for 'full down to original', aacr for 'AACR').
043 Discriminated from MARC 522 by shape: 043 produces a bffi:geographicCoverage URI reference (LoC geographic areas vocabulary), 522 produces a bffi:GeographicCoverage bnode with rdfs:label. The XSLT emits 043 $a as a vocabulary URI and 522 $a as a bnode value.
045 Plain literal emit. The XSLT produces bf:temporalCoverage as an EDTF-typed literal for both $a and $b. No other MARC tag maps to this predicate, so every literal is a 045 subfield. $a is the primary time period; $b is additional information (when ind1=2, two $b subfields may appear as two separate literals).
046 Two BFFI predicates from one MARC field: bffi:originDate$k, bffi:validDate$l. Each is a plain EDTF literal. The XSLT does not emit bf:deathDate or bf:birthDate, so $m and $n are never produced. No discriminator needed — the predicates are unique to MARC 046.
074 Dormant until the BIBFRAME → BFFI direction attaches bffi:marcKey to bare bf:Identifier bnodes. marc2bibframe2 does not assign 074 a specific subclass.
084 $2 emitted when bffi:source / bffi:code is present (e.g. 'ykl'); omitted otherwise. HELMET-local 09X classifications (091/092/093/094/095/097) are not reconstructable from BFFI — marc2bibframe2's ConvSpec-050-088.xsl has a template only for MARC 084 and the standard 050-088 tags; the 09X tags fall through to its default "drop unhandled datafield" path and never reach BIBFRAME XML. Corpus coverage is high (091/097 ~98 %, 095 ~79 %, 092 ~55 %, 094 ~30 %, 093 ~20 %), so the loss is material. Consumers who need 09X data must read the source MARCXML directly.
086 $2 emitted when bffi:source / bffi:code is present. The source URI discriminator is the LoC …/classifications/gpo URI, which marc2bibframe2 emits for MARC 086.
240 MARC 240 appears alongside a 1XX main entry (whereas 130 is the main entry itself). marc2bibframe2 flattens both into one Hub240 with the 240 subfields piggy-backing on the 1XX agent's marcKey. ind1=1 (traced) ind2=0 (0 nonfiling chars) per the dominant HELMET corpus convention; the actual source value is recoverable from the agent marcKey but not yet preserved.
245 First non-variant bffi:title block wins. Variant-titled blocks (typed with vartitletype/*) are skipped here and feed the 246 emit instead.
246 ind1=1 (Note, added entry) per HELMET corpus convention; ind2 blank. The specific vartitletype tail maps to different ind2 values in MARC source but the per-tail ind2 dispatch is deferred.
257 Discriminated from MARC 370 by origin: bf:Instance carries the MARC 257 (country of producing or filming place), bf:Work carries MARC 370 (associated place). Both emit bffi:originPlace as a bffi:Place bnode with rdfs:label. The XSLT does not attach bffi:marcKey to these fields, so axis is the only discriminator.
260 ISBD trailing punctuation (" :" before $b, "," before $c) is added at emit time. If no Publication-typed provisionActivity carries the structured parts, the flat bffi:publicationStatement is the fallback — whole transcribed string in $a.
300 First-extent-wins for multi-extent records (rare). ISBD trailing punctuation (" :" before $b, " ;" before $c, " +" before $e) is added at emit time.
336 Content type is an Expression attribute, not a Work one. Expressions point outward (bffi:expressionOf / bffi:manifestationOfExpression) with no inverse from the Work, so the traversal has to be inverted to reach them. Source MARC \$a is the cataloguer's display label (often Finnish); BFFI carries the URI's rdfs:label. Records whose source had no 336 still emit one when marc2bibframe2 derived a content type from the leader/008.
351 Bnode emit from bffi:CollectionArrangement. $a is the rdfs:label on the bnode (the general group designation); $b is bffi:unitID literal when present; $c is bffi:classMark literal when present; $3 is bffi:appliesTo literal when present. The XSLT emits 351 $a as the rdfs:label on bf:CollectionArrangement.
352 Plain literal emit from bffi:CartographicDataType bnode. The $a subfield becomes rdfs:label on the bnode; $b is not produced by the XSLT (no bf:title on the CartographicDataType). $q becomes bffi:fileFormat literal when present. $6 becomes bffi:occurrenceId when present.
353 marc2bibframe2's 353 template emits $b as a bare identifier when it's not a URI, so $a / $b / $0 collapse into a single identifier value. The reverse path emits $0 only when the identifier is present; $b is absorbed into $0.
370 Source \$0 (the authority URI) is not recoverable: marc2bibframe2 drops MARC 370 \$0 entirely, so it never reaches the BFFI graph. \$g and \$2 round-trip.
384 Plain literal emit. The XSLT produces bf:keyMode (a bnode with rdfs:label), the BFFI routing collapses it to bffi:musicKey literal. The literal value becomes MARC 384 $a.
490 490 is the untraced series statement (no 8XX partner). The discriminator is mstatus/t alone — a co-typed mstatus/tr signals that an 830 controlled-series partner exists and the transcribed view is suppressed here to avoid double-emit. ind1=0 (Series not traced) per HELMET corpus convention. ISBD trailing " ;" is added on $a when $v follows.
500 Notes typed with a specific mnotetype dispatch to their own MARC tag (e.g. mnotetype/lang → 546). Others fall through to 500. Per-tail expansion (504 bibliography / 511 participants / 520 summary / etc.) is a follow-on.
501 Without a mnotetype discriminator the bf:Note from 501 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
502 MARC 502 source carries up to six subfields (\$a, \$b, \$c, \$d, \$g, \$o) but marc2bibframe2 collapses them into a single rdfs:label on the bf:Dissertation bnode. Reverse emit produces only \$a.
513 Without a mnotetype discriminator the bf:Note from 513 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
515 Without a mnotetype discriminator the bf:Note from 515 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
516 Without a mnotetype discriminator the bf:Note from 516 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
518 A source 518 written with \$o \$d \$p \$3 becomes a bffi:Capture with those structured properties and NO rdfs:label, so the label-only path emitted nothing for it. marc2bibframe2 also emits a second, derived Capture per field whose bffi:note is the generic word "capture" and whose dates are EDTF-normalised; that companion is skipped to avoid double-emitting.
533 Without a mnotetype discriminator the bf:Note from 533 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
534 534 records the original publication of a reproduction or re-release (typical HELMET corpus shape: \$c "Danjaq : United Artists, 1974" on a 2001 DVD reissue). The full source row is collapsed into a single \$c literal at the BFFI layer; \$a main entry, \$b edition, \$f series etc. are not individually preserved.
536 Without a mnotetype discriminator the bf:Note from 536 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
540 506 vs 540 are disambiguated by the policy's rdf:type: bffi:AccessPolicy → 506 (restrictions on who can access); bffi:UsePolicy → 540 (what users may do with the material). Both predicates funnel through bffi:usageAndAccessPolicy.
541 541 is item-level in MARC. This reverse path emits from the Manifestation when the BFFI graph attaches the predicate there; Items are not modelled separately in BFFI 1.0.0.
544 Without a mnotetype discriminator the bf:Note from 544 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
545 Without a mnotetype discriminator the bf:Note from 545 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
547 Without a mnotetype discriminator the bf:Note from 547 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
550 Without a mnotetype discriminator the bf:Note from 550 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
555 Without a mnotetype discriminator the bf:Note from 555 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
556 Without a mnotetype discriminator the bf:Note from 556 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
581 Without a mnotetype discriminator the bf:Note from 581 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
583 MARC 583 source carries up to ten subfields (\$3 materials, \$a action, \$c time, \$h jurisdiction, \$k agent, \$l status, \$u uri, \$z public note, etc.) but marc2bibframe2 collapses the whole row into a single bf:Note with the concatenated text as rdfs:label. Reverse emit therefore produces only \$a; the structured subfields are not recoverable from a bare bffi:Note.
585 Without a mnotetype discriminator the bf:Note from 585 is indistinguishable from 500. The reverse path recovers the tag from bffi:marcKey; notes lacking the marcKey carrier fall through to 500.
587 marc2bibframe2 splits 587 into two mnotetype tails by ind1 (datasource for ind1=' ', datanf for ind1='0'). The reverse converter restores ind1 from the tail. A single tag entry is listed here; both tails route to MARC 587.
653 653 is MARC's catch-all for uncontrolled subject terms. The bffi:Uncontrolled co-type takes priority over the structural Topic/Person/Place dispatch — source-MARC 653 spans every term-kind so the structural rdf:type isn't the right discriminator.
662 662's hierarchical structure ($a country, $b first-order admin, $c subsequent-order admin, $d city, $f city-subsection, $g other) is collapsed into a single rdfs:label by marc2bibframe2; the reverse path emits just $a + the structural metadata ($0 / $2).
730 Indicators and every subfield are reconstructed from bffi:marcKey verbatim. The auto-table lists the common subfields seen in the corpus ($a $g $l $n $o $p); any additional subfield codes carried in bffi:marcKey are emitted in the order they appear.
740 Indicators (including nonfiling-character counts in ind1) and every subfield are reconstructed from bffi:marcKey verbatim — same shape as 730.
773 MARC linking entry. Per-ind2 sub-dispatch (which 780/785-style splits would require) is not modelled here. $w / $i / $x / $z are only reconstructed via marcKey-driven recovery; the label/title fallback emits just $a and $t.
775 MARC linking entry. Per-ind2 sub-dispatch (which 780/785-style splits would require) is not modelled here. $w / $i / $x / $z are only reconstructed via marcKey-driven recovery; the label/title fallback emits just $a and $t.
776 MARC linking entry. Per-ind2 sub-dispatch (which 780/785-style splits would require) is not modelled here. $w / $i / $x / $z are only reconstructed via marcKey-driven recovery; the label/title fallback emits just $a and $t.
856 $y (link text) and $z (public note) are not yet round-tripped — marc2bibframe2 wraps them on a bf:Note bnode attached to the electronic locator's containing Item; the reverse path emits only the bare URL today.
880 880 is a reconstruction artifact, not a primary MARC field. It mirrors alt-script content detected on the main field during BFFI → MARC conversion. The $6 field links it to the main field as '{main_tag}-{occurrence:02d}{script_indicator}'. Extra subfields ($e, $b, $c) are copied from the alt-script dataclass when present.