Source format preservation

The UFO and Designspace fields preserved or explicitly rejected by the editor.

StatusAlpha
StabilityVerify details against the current source

This reference lists the source-format fields accepted by the filesystem UFO/Designspace adapter and their authoritative owners. Anything not listed here must either remain opaque under the listed boundary payload or fail before Project construction. It must never disappear during load, canonical edit, save, Save As or reopen.

Ownership labels

UFO allowlist

UFO field familyCurrent authoritative ownerExport rule
Source destination and dirty/save statusProject source shellSave and Save As publish only to checked destinations; source removal never deletes the UFO.
metainfo.plist: creator, format version and minor versionSourceFormatDataPreserve the decoded values exactly.
fontinfo.plist: family/style, copyright/trademark, designer/manufacturer/license/description/version/unique/sample/PostScript/typographic/WWS namesCanonical CanonicalFontInfo::namesClear from the preservation payload and reconstruct from the canonical value.
fontinfo.plist: units per em, ascender, descender, x-height, cap height and italic angleCanonical CanonicalFontInfo::metricsRetain exact f64 values and reject nonfinite values or negative units per em.
fontinfo.plist: supported hhea and OS/2 metrics, head flags, embedding and selection flags, weight/width class, vendor ID, note and major/minor versionCanonical CanonicalFontInfo OpenType fieldsClear from the preservation payload and reconstruct from the canonical value.
Every other field represented by Norad 0.18.4 FontInfoSourceFormatDataPreserve the typed value unchanged; representative unowned name and PostScript fields are exercised by the allowlist regression.
features.feaCanonical per-source metadataPreserve exact text; Save As also relocates recursively resolved relative include files.
groups.plist and kerning.plistCanonical per-source metadataPreserve all valid groups, member order, typed pair spelling and exact finite f64 values.
lib.plist entries for public.skipExportGlyphs and public.openTypeCategories that name loaded glyphsCanonical per-source glyph metadata for semantics; SourceFormatData for source orderingCanonical values control edits; the glyph-free boundary record preserves list order, source spelling and unknown-name entries.
Entries in those two standard dictionaries that do not name a loaded glyph, plus every other font-lib keySourceFormatDataPreserve exact plist values and merge canonical entries without overwriting residual entries.
Layer order, layer names, glyph-directory paths, layer color and layer libSourceFormatData, addressed by canonical LayerIdPreserve order and exact persistence paths while canonical source/layer structure owns editable association.
Glyph name and layer membershipCanonical Project glyph/source structureStructural operations update stable identities and rebuild the corresponding GLIF set.
Contours, point coordinates/types/smooth state, components, anchors and their paint orderCanonical Babelfont geometryExport from canonical geometry without a persistent UFO glyph owner.
Horizontal and vertical advances, Unicode order, note, guidelines, image placement and residual glyph libLayer preservationRetain exact values beside the stable layer identity and merge known keys only at export.
Contour, point, component, anchor and guideline identifiers, names, colors, transforms and object libsLayer preservation keyed by stable object identityReorder moves metadata with identity; replacement retains metadata only through an explicit mapping.
Mark color, metrics formulas, composition recipe, metaballs, smart-component values and poles, HOI intermediates, editable hyperbezier kind and mask encodingTyped or validated layer preservationDecode known keys once, retain their exact supported source representation and write each key once at export.
images/ and data/ resource names and bytesSourceFormatDataPreserve exact relative names and bytes; image placement is a separate layer value.
Exact contents.plist GLIF filenamesFilesystem preservationRestore validated relative paths after staging and verify the staged font reloads with them.
Regular files outside Norad-managed UFO files, images/ and data/Filesystem preservationCopy bytes unchanged into the staged UFO.

Designspace allowlist

Every accepted Designspace field is canonical; there is no opaque XML fallback. The checked XML reader rejects unknown structure before Norad can ignore it.

Designspace field familyCanonical owner
Format versionCanonicalDesignspace
Continuous axes: name, tag, explicit or implicit minimum/maximum, default, hidden flag, ordered map and localized labelsCanonicalAxis
Full sources: order, family/style/name, filename and sparse user-or-design locationSourceDescriptor plus CanonicalLocation
Layer-only sparse sources: order, owning UFO/layer, family/style/name and locationSparseSourceDescriptor plus SourceOrderEntry
Instances: order, family/style/name, filename, PostScript name, style-map names, location and instance libCanonicalInstance
Rules: processing order, names, ordered condition sets, bounds and substitutionsCanonicalRule
Top-level libCanonicalDesignspace opaque plist dictionary
Presence of an empty axis-mappings containerCanonicalDesignspace preservation flag

formats::designspace validates the XML element and attribute allowlist before typed decoding, and every persisted coordinate must round-trip through Norad’s f32 representation.

Intentional rejection boundary

The adapter intentionally returns an error for these inputs instead of attempting a lossy save:

Rust Babelfont JSON remains unsupported. The Python Babelfont directory importer is a separate checked conversion contract and never rewrites its source package.