SchemaSpec+TemplateSet+ a pluggablePresetStorecodec — a declarative, self-documenting template-file system (2026-06-27). A new shared layer for "named config/template files a user can model their own after," split into three composable, Qt-free, zero-dependency primitives so the shape and the storage of a template each have one SSoT.SchemaSpec(core_utils/schema_spec.py) is a base for schemas defined as a@dataclass: fields declared viaspec_field(help=…, example=…, required=…, nested=…, choices=…, validate=…)carry their own documentation, and from that single definition the base derives — with no per-schema code —validate()(returns aValidationResultthat deliberately splits errors (unknown discriminator, wrong structure, missing required) from warnings (an unrecognised key;_-prefixed keys are reserved for annotations and never warned), so a file that merely carries an extra key keeps working; itsraise_or_warn()is the one-call "enforce a validated file" helper every loader shares),skeleton()(a fully-populated example dict to copy, omitting unset optionals), genericfrom_dict/to_dict(recursing nested schemas), anddescribe()/to_markdown()(a field-by-field reference, nested schemas rendered as sub-tables — so the doc can never drift from the enforced shape).PresetStoregained an additivecodec: Codecparameter (defaultJSON_CODEC, fully back-compatible — every existing caller and uitk'sPresetManagerare unaffected): aCodec(ext, load, dump)makes the store format-agnostic, so a caller can back*.yamlfiles by injecting a YAML codec without pythontk taking a YAML dependency (the caller supplies it).extis now a property; discovery/path/load/saveroute through the codec.TemplateSet(core_utils/template_set.py) is the thin glue binding aPresetStore(two-tier built-in + user discovery, shadowing, last-used.activepointer) to aSchemaSpec(shape):names()/source()/user_dir/active,raw()(plain dict) vsload()(parse → validate → deserialise, raising on errors, logging warnings,strict=to raise on warnings too),skeleton(),save()/write_skeleton()(write arbitrary data or the generated skeleton to the user dir), andmarkdown(). Motivated by — and first consumed by — mayatk's Shot Manifest, whose CSV mapping (JSON) and behavior (YAML) template files were each globbed from inside the installed package with no user tier, no validation, and docstring-only schemas; both now share this one mechanism (see mayatk CHANGELOG 2026-06-27). Root exports:SchemaSpec,spec_field,ValidationResult,SchemaError,FieldDoc,Codec,JSON_CODEC,TemplateSet. Tests:test_schema_spec.py(19: validate errors/warnings/nested/choices/custom-validator, skeleton-is-self-valid, describe/markdown, round-trip),test_template_set.py(10: tiering, load-validates-and-raises, raw-skips-validation, skeleton/write_skeleton, user-shadows-builtin, custom-codec ext+IO),test_preset_store.py(+3 codec: default-is-JSON, custom-ext round-trip, cross-codec invisibility); 45 green pythontk-side, uitkPresetManagersuite 74 green (consumer unaffected).