# ADR 0034: Registry-driven authoring components

## Status

Accepted

## Context

The Add Component palette was registry-backed, but presence checks, copy/paste, reset, removal,
history, save filtering, validation, and most inspector dispatch were duplicated as Rust `match`
statements. `InspectorOrder` also stored active state, causing hydration and game systems to depend
on editor presentation metadata. `ActorKind` was used as validation authority, which prevented
otherwise valid component composition such as a rendered mesh that also emits light.

## Decision

- Every authoring component registration has an immutable editor/protocol ID separate from its
  reflected Rust type path. Startup validation rejects duplicate IDs/types, missing reflection
  adapters, and unknown recommendation/conflict references.
- Bevy reflection supplies generic presence, default insertion/reset, removal, copy/paste, and RON
  values for atomic `ComponentTransaction` history. A transaction includes the derived
  `ActorKind` hint so one undo restores the complete component edit.
- The registry builds the scene component allowlist. A statically linked extension uses
  `register_authoring_component` to register reflection metadata, lifecycle metadata, and an
  inspector callback together.
- Persisted `AuthoringComponentStates` owns component active state. `InspectorOrder` owns only card
  ordering. Schema-v3 state embedded in `InspectorOrder` is moved lazily and remains a read fallback
  during migration.
- `ActorKind` remains serialized for compatibility and presentation, but is derived from component
  composition on load and component transactions. Validation enforces component data and explicit
  geometry-source conflicts rather than comparing behavior with the stored hint. Compatible
  components, including mesh plus light, may coexist.

## Consequences

- New statically linked authoring components participate in save filtering and generic component
  operations without adding editor-core history or persistence branches.
- Runtime systems read active state independently from inspector layout. Old scenes preserve their
  disabled components and upgrade in memory before their next save.
- Geometry source conflicts remain explicit, while presentation categories no longer prohibit
  unrelated behavior composition.
- Existing whole-entity spawn/duplicate snapshots still have typed fields. Moving those snapshots
  and every built-in inspector renderer to the reflected registry is follow-up work; the generic
  transaction path is the required path for new component operations.

