#1197 Report the retired harnesses: frontmatter key from validate - #1204
Merged
Conversation
`codeassembly validate` reports a skill whose frontmatter still declares `harnesses:`, naming the file and the key to rename it to. Left undetected the retired key fails in two silent ways at once: the skill stops narrowing and deploys to every harness, and the key survives into the deployed `SKILL.md`.
`validate` leaves a library skill's retired harness-narrowing key alone, since only the content root under validation can rename it. Nothing covered that until now: the default library carries no such key, so dropping the ownership check changed no test outcome.
`codeassembly validate` was documented as catching defects that would fail at a consumer. It also catches one that fails nowhere: a skill declaring the retired `harnesses:` key deploys to every harness and carries the key into the deployed file, and the command's documented reach now says so.
Dependency auditProduction dependency audit passed. |
williamthorsen
marked this pull request as ready for review
August 5, 2026 16:37
williamthorsen
added a commit
that referenced
this pull request
Aug 7, 2026
…ssembly-mcp-v0.2.4 codeassembly-v0.6.0 codeassembly-v0.6.0 - #794 feat: Guide kb-add note placement with the store's declared taxonomy (#1223) - #1111 feat: Declare which harnesses sync targets (#1221) - #1214 feat: Allow an artifact to belong to more than one collection (#1219) - #1186 drop!: Dissolve `common-mistakes` into its consumers' guidance (#1217) - deps: Upgrade all deps to latest version - #1203 fix: Bar acceptance-criteria revision prompts to genuine conflicts (#1212) - #1196 feat: Add the .kb/taxonomy.yaml format with drift reporting and back-fill (#1210) - #1165 feat: Make a vetted subset of the library declarable (#1207) - #1197 feat: Report the retired `harnesses:` frontmatter key from `validate` (#1204) - #963 feat!: Rename the harness id to rovo and qualify the frontmatter key (#1199) - #1188 drop!: Retire the bundled Bitbucket inline-comment script (#1198) - #1187 feat: Gate the boolean prefix on a test and add the tail rule it rests on (#1195) factory-v0.2.4 - deps: Upgrade all deps to latest version - deps: Upgrade all deps to latest version - #1209 refactor: Clear factory's remaining lint violations and retire both deferral lists (#1216) - #1208 refactor: Clear the visualizations lint violations and retire six rule deferrals (#1213) kb-v0.4.0 - #794 feat: Guide kb-add note placement with the store's declared taxonomy (#1223) - #1196 feat: Add the .kb/taxonomy.yaml format with drift reporting and back-fill (#1210) codeassembly-lifecycle-v0.3.0 - #963 feat!: Rename the harness id to rovo and qualify the frontmatter key (#1199) codeassembly-mcp-v0.2.4 - #1206 refactor: Retire fleet's lint deferrals (#1211) - #1200 tooling: Retire mcp's lint deferrals and prune the dead root entries (#1205)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
codeassembly validatenow reports every skill whose frontmatter still declares the retiredharnesses:key instead ofsupported-harnesses:, and exits non-zero.This is a safeguard for the recent retirement of the old key. Use of the old key in a skill's declaration would have silently deployed to every harness.
Why
The rename to
supported-harnesses:left the bareharnesses:key as valid YAML that nothing reads. A skill still carrying it loses its harness narrowing and ships the dead key into every harness's installed copy, and neither failure raises anything anywhere — the author's only signal is noticing the skill somewhere it should not be.codeassembly.yamlusesharnesses:as a real key of its own, so the confusable write is easy to reach for.Details
🎉 Features
validateContentRootgains a harness-independent pass over every skill the content root owns, carried by a newfrontmatterdefect kind. The report names the offending file and the key to rename to, and rides the command's existing non-zero exit.harnesses:, a scalar, and a list all report, since the key's presence is what survives into deployed output regardless of what it holds.parseFrontmatter→parseYamlcomposition the deploy path uses, sovalidatesees exactly the frontmatterreadTargetHarnessessees.🧪 Tests
dependencies:edge, stays silent. The last fails if the ownership filter is removed.writeSkillfixture helper gains aretiredHarnessesoption that emits the retired key.📚 Documentation
validatewas described as checking for defects that would fail at a consumer. That was true of every pass it had; this one reports a defect that fails nowhere. Four sites now say "defects that reach a consumer" — the CLI tables inAGENTS.mdand the package README, plus the CLI's own--helptext.validateContentRootdoc comment each account for the pass that has nosynccounterpart, naming what it catches and why nothing else would.Closes #1197