# Unify Vocabulary + Authority CRUD — Design **Date:** 2026-06-08 **Status:** Approved (brainstorming) — ready for implementation planning. **Issue:** #64 (the duplicated Vocabulary-terms + Authorities CRUD surfaces). ## Context The Vocabulary-terms and Authorities admin surfaces are two copies of one feature ("a labelled record with an optional external URI: filterable list + inline-edit rows + create form"). The duplication spans four files and ~280 lines: - `vocab/term-row.tsx` and `authorities/authority-row.tsx` are byte-for-byte twins except: the mutation hooks (`useUpdateTerm`/`useDeleteTerm` vs `useUpdateAuthority`/`useDeleteAuthority`), the record type (`TermView` vs `AuthorityView`), the URI-input id prefix (`term-uri-` / `auth-uri-`), the mutate-arg shape (`{ vocabularyId, termId, … }` vs `{ id, kind, … }`), and the delete-confirm i18n key. - `authorities/authorities-page.tsx` and `vocab/vocabulary-terms.tsx` share the filter input, the 4-state list (loading→skeleton / error / empty / no-matches / rows), and the create form (`LabelEditor` + URI input + `labels.some()` validation + `MutationError` + submit). They differ in the i18n keys, the create-form heading, and (authorities only) the kind-tabs `