Expand description
Seed the global Skills catalog (db_skills, per-channel) with a curated
starter set on fresh install.
Runs exactly once per channel, tracked in that channel’s db_migrations
table — NOT gated on “is the catalog currently empty.” The prior
seed_starter_skills_if_empty gate (removed) couldn’t distinguish “never
seeded” from “seeded then the user deleted every starter skill on
purpose,” so a normal srv restart after a full deletion silently
resurrected the defaults (reagent P2, PR #2141 round 2 — confirmed by
skill_seed.rs’s own former test). The migration framework’s
once-ever-per-channel tracking fixes this at the root: once
0015_seed_starter_skills is marked applied, it never runs again for
that channel regardless of what the user does to the catalog afterward.
Self-heals against installs that already ran the retired pre-migration
startup-seed path (#2141) before this migration existed — every such
channel already has the 6 starter-skill names present, which would
collide with skill_upsert_unique_global’s name-uniqueness check and
permanently fail this migration on every boot if seeding were attempted
unconditionally (reagent P1, PR #2144). up() checks for an existing
name collision first and treats it as “already seeded” rather than
inserting.