decide: per-skill metadata.version has no owning rule
#127
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found during the #99 ADR-0020 retrofit and the follow-up audit pass on
refactor/adr0020-skill-retrofit. Not fixed there, because there is nothing to fix until the convention exists — any edit would be one agent's guess overwriting another's.The measurement
Counted just now against the working tree, over all 39 skills, distinguishing
metadata.version(nested) from a top-levelversion::metadata.versioncorelintgiteagitea-filesbingitkyberforgeThe split is per-plugin, not per-skill: three plugins use it near-universally, three not at all.
gitea-filesis the single intra-plugin exception.One skill,
bin/write-docs, carries a top-levelversion: "1.0"alongside ametadata:block that holds onlycategory. That is a different field in a different position, and it is the only instance of it in the corpus — worth resolving in the same pass, since "does a skill carry a version" and "where does it live" are the same question.Why nothing settles it
skill-audit's reference files do not mention the field.skill-author/references/create.md:104mentions it once, permissively, in a list of optional frontmatter:- `metadata` — key-value map; use `author`, `version`, `category`. That is an invitation, not a convention — it says nothing about whether it is required, what the format is, or when it gets bumped.scripts/or inagent-audit/skill-audit'svalidate.shreads it.plugin.json/apm.ymlparity) and its first line reads "Moot as of ADR-0015." — the invariant it protected is deleted, not adapted.Why it surfaced
Two agents on this branch reached opposite conclusions in good faith, both locally correct:
git-commits' lonemetadata.versionas drift, reasoning that no other git skill has one and an unmaintained version string is worse than none;lintskills' versions as part of editing them, reasoning that lint is 2/2 and a changed skill with a stale version is a lie.Neither can be called wrong against the current state of the repo, which is the tell that the rule is missing rather than misapplied. The same disagreement will recur on every future edit that touches a skill in
core,lint, orgitea.The decision
Pick one and write it into
skill-audit's rubric (and, if it becomes a requirement, intoskill-author's create flow):metadata.version; define the bump rule (what counts as a bump-worthy change) and add a gate. Costs 28 backfills and a maintenance obligation on every edit.Whichever is chosen, decide
gitea-filesandwrite-docsin the same pass, and re-measure first: the counts above are fromrefactor/adr0020-skill-retrofitand skills are being edited on it.Files
plugins/kyberforge/.apm/skills/skill-audit/references/— where the rule belongsplugins/kyberforge/.apm/skills/skill-author/references/create.md:104— the one permissive mentiondocs/adr/0006-plugin-version-parity.md— moot, but the nearest prior artplugins/bin/.apm/skills/write-docs/SKILL.md— the top-levelversion:outlierplugins/gitea/.apm/skills/gitea-files/SKILL.md��� the intra-plugin exceptionRelated
skill-audit/skill-authorstructural questionImplementation note
Decision (discussed and confirmed in session, recorded in
docs/adr/0022-skill-metadata-version-is-mandatory.md):metadata.versionmoves from a per-plugin, undocumented split to mandatory on every skill. Skills that never carried one are seeded at1.0.0(not0.1.0— that value stays reserved for a brand-new skill's actual starting point). Skills that already had real tracked history keep their existing value untouched.Non-git portion done (git-plugin portion is in progress under the same decision, will follow up here):
metadata.version: "1.0.0": all 11binskills exceptresearch(which had ametadata:block but no version — same treatment) andwrite-docs(special case below), all 7kyberforgeskills, andgitea-files.write-docsspecial case: it carried a stray top-levelversion: "1.0"outside themetadata:block, not a fresh, unversioned skill. Moved that existing value intometadata.versionrather than overwriting it with1.0.0, and removed the top-level field.plugins/kyberforge/.apm/skills/skill-author/references/create.md—metadata.versionmoved out of "Optional frontmatter" into the required-fields framing, citing ADR-0022.plugins/kyberforge/.apm/skills/skill-author/SKILL.md— dropped the "withmetadata.versionpresent" conditional in the version-bump rule; it's unconditional now (minor on create from0.1.0, patch on improve)..pre-commit-config.yaml'sskill-frontmatterhook — extended to fail a SKILL.md missingmetadata.version, same class of failure as a missingname:/description:. Verified against a negative-test fixture (stripped-version copy fails; untouched already-versioned skill still passes).Not yet reset:
git-commitskeeps its existing0.1.3— it already had genuine tracked history under the old conditional rule, and this decision doesn't roll back skills that were already compliant.Implementation note (follow-up — git-plugin portion)
Completed the remaining slice:
git-branches,git-history,git-remotes,git-submodules,git-workflow,git-worktrees,pc-author,pc-runall seeded withmetadata.version: "1.0.0"as the first key undermetadata:, matchinggit-commits' existing style.git-commits' own"0.1.3"left untouched, per the earlier note in this thread — it already had real tracked history.All 39 skills now carry
metadata.version. This was bundled with #113's implementation pass since both touched the same nineplugins/git/.apm/skills/*/SKILL.mdfiles — see #113 for that half's detail.