Fixture GDTF derivative and project-symbol identity
Separate identities and owners
Manufacturer@FixtureType@Perastage.gdtf is a Perastage derivative naming
convention, not an official GDTF semantic. The
GDTF symbol ownership and mutation contract
separates standards-compliant device definitions from project presentation.
GDTF 1.2 owns standard Top/Side/Front resources and official model offsets;
PSTG owns Perastage Top/Front/Side/Bottom symbols and user overrides. A project
symbol is not evidence that a GDTF is complete or Perastage-owned.
Core prepares intentional GDTF changes in private working storage, applies standard mutations and revisions, canonicalizes, and atomically publishes the derivative before rebinding fixtures. Valid external FixtureTypeID values are preserved. Shared publication rejects invalid structure without replacing an existing destination. Missing standard views may be completed when policy permits; existing usable or unusable views are never automatically replaced. Project-symbol Apply does not create or rewrite a GDTF derivative.
During a project GDTF edit, the successfully published project definition and
Fixture.gdtfSpec are authoritative. Library synchronization is secondary; its
failure is a warning and cannot roll back a valid project result. Successful
publication invalidates the parsed-SVG cache and triggers viewer refresh.
Private .working references are never attached to fixtures. Project internal
symbols remain independent from physical-property edits and derivative validation.
Replacement identity
Imported source identity, selected replacement identity, project ownership, and the user-facing fixture label remain separate. Within one import transaction, an explicit GDTF Share RID plus exact compatible mode proves that different source aliases chose the same replacement. Downloads are reused and affected fixtures share one project reference. Similar names alone never prove equivalence.
Project symbol bindings are explicit fixture-UUID to definition-ID to
content-ID mappings, persisted by core/symbols/project_fixture_symbols.*.
Generated fallback and user override kinds, source FixtureTypeID/fingerprint,
generator/schema versions, view offsets, optional per-view archive/provenance
metadata, and exact SVG bytes are retained.
Newly inserted instances inherit only an unambiguous content identity shared
by all bound fixtures with the same nonempty exact source reference and mode;
conflicting overrides remain untouched and diagnostic. Identical bundles share
content-addressed payloads. Only definitions referenced
by the current scene are packaged. See the resource contract
for the archive layout and schema.
Startup, persistence, and legacy input
Project Save serializes the scene and referenced project bundles through
ProjectSession::ArchiveResource. It does not generate symbols or wait for
preparation. Project symbols reside outside scene.mvr and are not exported as
private MVR files or embedded GDTF resources. Load restores exact project
presentation without requiring a global cache, original external GDTF, or a
matching generator version. Corrupt indexed bundles fail loading transactionally
before active scene/config callbacks, preserving the previous project.
gdtf_derivative_contract_version = 1 remains the historical derivative migration
marker, separate from the versioned PSTG project-symbol schema. Projects without
that marker retain the bounded legacy migration over unique referenced GDTFs.
Historical numbered copies may be unified only when authoritative base content
and exact mode agree after removing narrowly recognized legacy symbol output.
Unsupported or ambiguous resources stay untouched and do not prevent Save.
Recognized legacy private symbols, Bottom extensions, and positively identified old generated standard-location resources remain read-only inputs. On Save, before legacy GDTF reference consolidation, and before automatic standard completion retargets references, a compatible internal representation is materialized as project-owned resources without rewriting the external source on open. Unknown authored SVGs are not claimed by basename, generic editor metadata, or unrelated revisions. Overwritten original manufacturer bytes require a clean authoritative source; Perastage does not reconstruct them speculatively. Intentional derived publication removes recognized private compatibility output through the shared Core policy. Unchanged legacy input can remain embedded under the existing canonical MVR preservation policy; the migration adds no new private files to that GDTF.
Runtime preparation
The preparation service keys work by resolved physical GDTF path and exact mode; duplicate requests coalesce and distinct modes remain distinct. A project epoch rejects callbacks from replaced or closed projects. Each four-view capture is one atomic GUI-thread operation. CPU processing and later project application/standard publication are cooperative stages. Jobs recheck source fingerprints before application.
Persisted project symbols are authoritative and are not regenerated merely
because the generator changed. Manual Apply stores a UserOverride; automatic
work stores GeneratedFallback only when an internal representation is needed.
Automatic standard completion separately consults the configured mutation policy
and never replaces existing resources. Source changes or explicit regeneration
must follow the product workflow rather than silently discarding an override.
Renderers continue to draw standard/geometry fallback immediately while work is pending. Save, Load, MVR import/export, print, layout, and PDF do not wait for queue completion. The runtime parsed-SVG cache remains disposable and independent from project storage; project lifecycle transitions clear it, and physical standard derivative replacement invalidates the changed resource path.
Project symbol tokens include immutable definition/content identity and
participate in live layout frame hashes. Apply and Undo/Redo invalidate layout
visual content. Saved layout cache validation includes the exact referenced
PSTG symbol resources together with packaged layout images, independently from
the scene.mvr fingerprint. Background PDF workers read an immutable captured
store through the scoped Core read context, preserving the selected definition
when the active project or its overrides change.