@skill-graph/cli 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/CHANGELOG.md +247 -0
  2. package/LICENSE +200 -0
  3. package/NOTICE +62 -0
  4. package/README.md +398 -0
  5. package/SKILL_GRAPH.md +443 -0
  6. package/bin/skill-graph.js +374 -0
  7. package/docs/ADOPTION.md +117 -0
  8. package/docs/CONFORMANCE.md +66 -0
  9. package/docs/PRIMER.md +384 -0
  10. package/docs/QUICKSTART-30MIN.md +333 -0
  11. package/docs/ROUTING-METRICS.md +120 -0
  12. package/docs/SKILL-MD-FORMAT-COMPATIBILITY.md +127 -0
  13. package/docs/SKILL_AUDIT_CHECKLIST.md +199 -0
  14. package/docs/SKILL_AUDIT_LOOP.md +195 -0
  15. package/docs/SKILL_METADATA_PROTOCOL.md +609 -0
  16. package/docs/_archived/marketplace-publication-priority-2026-05-18.md +239 -0
  17. package/docs/adr/0001-predicate-set.md +69 -0
  18. package/docs/adr/0002-json-ld-context.md +82 -0
  19. package/docs/adr/0003-ontoclean-rigidity-tags.md +65 -0
  20. package/docs/adr/0004-persistent-identifiers.md +74 -0
  21. package/docs/adr/0005-freshness-consolidation.md +70 -0
  22. package/docs/adr/0006-revise-predicate-rename.md +105 -0
  23. package/docs/adr/0007-audit-loop-cadence.md +99 -0
  24. package/docs/adr/0008-skill-surface-split-and-curation-policy.md +93 -0
  25. package/docs/category-consumers.md +168 -0
  26. package/docs/concept-map.md +194 -0
  27. package/docs/diagrams/drift-states.mmd +21 -0
  28. package/docs/diagrams/manifest-pipeline.mmd +25 -0
  29. package/docs/diagrams/routing-harness.mmd +41 -0
  30. package/docs/diagrams/starter-graph.mmd +53 -0
  31. package/docs/field-decision-guide.md +315 -0
  32. package/docs/field-rationale.md +211 -0
  33. package/docs/field-reference.generated.md +624 -0
  34. package/docs/field-reference.md +1426 -0
  35. package/docs/glossary.md +190 -0
  36. package/docs/head-noun-glossary.md +63 -0
  37. package/docs/images/audit-phases.png +0 -0
  38. package/docs/images/drift-states.png +0 -0
  39. package/docs/images/graded-mode.png +0 -0
  40. package/docs/images/manifest-pipeline.png +0 -0
  41. package/docs/images/routing-harness.png +0 -0
  42. package/docs/images/skill-anatomy.png +0 -0
  43. package/docs/images/starter-graph.png +0 -0
  44. package/docs/images/system-model.png +0 -0
  45. package/docs/integrations/github-actions.md +155 -0
  46. package/docs/manifest-field-mapping.md +443 -0
  47. package/docs/marketplace-publication-queue.generated.md +240 -0
  48. package/docs/marketplace-release-agent-prompt.md +82 -0
  49. package/docs/marketplace-skill-candidate-list.md +272 -0
  50. package/docs/marketplace-syndication.md +222 -0
  51. package/docs/migration-sample-review.md +155 -0
  52. package/docs/migrations/v4-to-v5.md +168 -0
  53. package/docs/migrations/v5-to-v6.md +221 -0
  54. package/docs/name-exceptions.yaml +37 -0
  55. package/docs/plans/marketplace-p1-public-migration-plan.md +41 -0
  56. package/docs/plans/multi-root-workspace.md +148 -0
  57. package/docs/plans/scripts-roadmap.md +107 -0
  58. package/docs/plans/v4-schema-bump.md +160 -0
  59. package/docs/plans/wave-2-extraction.md +122 -0
  60. package/docs/positioning-vs-marketplaces.md +175 -0
  61. package/docs/proposals/skill-audit-loop-positioning.md +160 -0
  62. package/docs/quality-doctrine.md +138 -0
  63. package/docs/recommended-skills.md +150 -0
  64. package/docs/research/skill-comprehension-eval-research.md +1830 -0
  65. package/docs/research/skill-retrieval-evidence.md +66 -0
  66. package/docs/skill-metadata-protocol.md +471 -0
  67. package/docs/skills-sh-maintainer-cleanup-request.md +80 -0
  68. package/examples/audits/a11y/findings.md +52 -0
  69. package/examples/audits/a11y/scorecard.md +21 -0
  70. package/examples/audits/a11y/verdict.md +44 -0
  71. package/examples/audits/debugging/findings.md +59 -0
  72. package/examples/audits/debugging/scorecard.md +22 -0
  73. package/examples/audits/debugging/verdict.md +33 -0
  74. package/examples/audits/documentation/findings.md +59 -0
  75. package/examples/audits/documentation/scorecard.md +22 -0
  76. package/examples/audits/documentation/verdict.md +33 -0
  77. package/examples/evals/a11y.json +140 -0
  78. package/examples/evals/api-design.json +52 -0
  79. package/examples/evals/code-review.json +52 -0
  80. package/examples/evals/data-modeling.json +52 -0
  81. package/examples/evals/database-migration.json +52 -0
  82. package/examples/evals/debugging.json +118 -0
  83. package/examples/evals/dependency-architecture.json +52 -0
  84. package/examples/evals/design-system-architecture.json +52 -0
  85. package/examples/evals/error-tracking.json +52 -0
  86. package/examples/evals/event-contract-design.json +52 -0
  87. package/examples/evals/form-ux-architecture.json +52 -0
  88. package/examples/evals/framework-fit-analysis.json +52 -0
  89. package/examples/evals/graph-audit.json +139 -0
  90. package/examples/evals/information-architecture.json +52 -0
  91. package/examples/evals/interaction-feedback.json +52 -0
  92. package/examples/evals/interaction-patterns.json +52 -0
  93. package/examples/evals/layout-composition.json +52 -0
  94. package/examples/evals/lint-overlay.json +117 -0
  95. package/examples/evals/microcopy.json +52 -0
  96. package/examples/evals/observability-modeling.json +52 -0
  97. package/examples/evals/pattern-recognition.json +96 -0
  98. package/examples/evals/performance-engineering.json +52 -0
  99. package/examples/evals/refactor.json +128 -0
  100. package/examples/evals/semiotics.json +52 -0
  101. package/examples/evals/skill-infrastructure.json +96 -0
  102. package/examples/evals/skill-router.json +140 -0
  103. package/examples/evals/skill-router.routing.json +113 -0
  104. package/examples/evals/system-interface-contracts.json +52 -0
  105. package/examples/evals/task-analysis.json +52 -0
  106. package/examples/evals/testing-strategy.json +118 -0
  107. package/examples/evals/type-safety.json +249 -0
  108. package/examples/evals/visual-design-foundations.json +52 -0
  109. package/examples/evals/webhook-integration.json +52 -0
  110. package/examples/exports/a11y.skill-md.md +80 -0
  111. package/examples/exports/debugging.skill-md.md +80 -0
  112. package/examples/exports/refactor.skill-md.md +78 -0
  113. package/examples/exports/testing-strategy.skill-md.md +81 -0
  114. package/examples/projects/markdown-static-site/README.md +115 -0
  115. package/examples/projects/markdown-static-site/skills/content-source-router/SKILL.md +131 -0
  116. package/examples/projects/markdown-static-site/skills/image-optimization-pipeline-config/SKILL.md +132 -0
  117. package/examples/projects/markdown-static-site/skills/link-rot-detection/SKILL.md +103 -0
  118. package/examples/projects/markdown-static-site/skills/markdown-post-frontmatter-validation/SKILL.md +133 -0
  119. package/examples/projects/markdown-static-site/skills/migrate-posts-to-v2-frontmatter/SKILL.md +140 -0
  120. package/examples/projects/saas-stripe-postgres/README.md +208 -0
  121. package/examples/projects/saas-stripe-postgres/db/migrations/0004_canonicalize_orders.sql +37 -0
  122. package/examples/projects/saas-stripe-postgres/db/schema.sql +112 -0
  123. package/examples/projects/saas-stripe-postgres/skills/migrate-orders-to-canonical-schema/SKILL.md +149 -0
  124. package/examples/projects/saas-stripe-postgres/skills/nextjs-server-action-validation/SKILL.md +154 -0
  125. package/examples/projects/saas-stripe-postgres/skills/payment-provider-router/SKILL.md +153 -0
  126. package/examples/projects/saas-stripe-postgres/skills/postgres-rls-pattern/SKILL.md +163 -0
  127. package/examples/projects/saas-stripe-postgres/skills/stripe-webhook-signature-verification/SKILL.md +137 -0
  128. package/examples/protocol/skill-metadata-template.md +301 -0
  129. package/examples/protocol/skills.manifest.sample.json +13245 -0
  130. package/examples/skill-metadata-template.md +317 -0
  131. package/examples/skills.manifest.sample.json +13519 -0
  132. package/examples/tests/v3-1-skos-fixture/SKILL.md +93 -0
  133. package/marketplace/README.md +17 -0
  134. package/marketplace/skills/a11y/SKILL.md +66 -0
  135. package/marketplace/skills/acid-fundamentals/SKILL.md +106 -0
  136. package/marketplace/skills/agent-engineering/SKILL.md +386 -0
  137. package/marketplace/skills/agent-eval-design/SKILL.md +55 -0
  138. package/marketplace/skills/ai-native-development/SKILL.md +294 -0
  139. package/marketplace/skills/api-design/SKILL.md +60 -0
  140. package/marketplace/skills/architecture-decision-records/SKILL.md +55 -0
  141. package/marketplace/skills/background-jobs/SKILL.md +265 -0
  142. package/marketplace/skills/bounded-context-mapping/SKILL.md +55 -0
  143. package/marketplace/skills/cap-theorem-tradeoffs/SKILL.md +127 -0
  144. package/marketplace/skills/client-server-boundary/SKILL.md +187 -0
  145. package/marketplace/skills/code-review/SKILL.md +120 -0
  146. package/marketplace/skills/color-system-design/SKILL.md +43 -0
  147. package/marketplace/skills/component-architecture/SKILL.md +126 -0
  148. package/marketplace/skills/compression/SKILL.md +112 -0
  149. package/marketplace/skills/conceptual-modeling/SKILL.md +181 -0
  150. package/marketplace/skills/connection-pooling/SKILL.md +105 -0
  151. package/marketplace/skills/constraint-awareness/SKILL.md +287 -0
  152. package/marketplace/skills/content-monitor/SKILL.md +209 -0
  153. package/marketplace/skills/context-engineering/SKILL.md +320 -0
  154. package/marketplace/skills/context-graph/SKILL.md +174 -0
  155. package/marketplace/skills/context-management/SKILL.md +174 -0
  156. package/marketplace/skills/context-window/SKILL.md +239 -0
  157. package/marketplace/skills/contract-testing/SKILL.md +120 -0
  158. package/marketplace/skills/cron-scheduling/SKILL.md +223 -0
  159. package/marketplace/skills/dark-mode-implementation/SKILL.md +47 -0
  160. package/marketplace/skills/data-modeling/SKILL.md +59 -0
  161. package/marketplace/skills/data-modeling-fundamentals/SKILL.md +117 -0
  162. package/marketplace/skills/database-migration/SKILL.md +429 -0
  163. package/marketplace/skills/debugging/SKILL.md +67 -0
  164. package/marketplace/skills/dependency-architecture/SKILL.md +58 -0
  165. package/marketplace/skills/design-module-composition/SKILL.md +43 -0
  166. package/marketplace/skills/design-system-architecture/SKILL.md +61 -0
  167. package/marketplace/skills/design-thinking/SKILL.md +44 -0
  168. package/marketplace/skills/diagnosis/SKILL.md +296 -0
  169. package/marketplace/skills/diff-analysis/SKILL.md +188 -0
  170. package/marketplace/skills/e2e-test-design/SKILL.md +113 -0
  171. package/marketplace/skills/entity-relationship-modeling/SKILL.md +218 -0
  172. package/marketplace/skills/epistemic-grounding/SKILL.md +112 -0
  173. package/marketplace/skills/error-boundary/SKILL.md +235 -0
  174. package/marketplace/skills/error-tracking/SKILL.md +261 -0
  175. package/marketplace/skills/eval-driven-development/SKILL.md +147 -0
  176. package/marketplace/skills/evaluation/SKILL.md +113 -0
  177. package/marketplace/skills/event-contract-design/SKILL.md +60 -0
  178. package/marketplace/skills/event-storming/SKILL.md +56 -0
  179. package/marketplace/skills/form-ux-architecture/SKILL.md +60 -0
  180. package/marketplace/skills/framework-fit-analysis/SKILL.md +59 -0
  181. package/marketplace/skills/frontend-architecture/SKILL.md +43 -0
  182. package/marketplace/skills/generative-ui/SKILL.md +118 -0
  183. package/marketplace/skills/graph-audit/SKILL.md +81 -0
  184. package/marketplace/skills/guardrails/SKILL.md +118 -0
  185. package/marketplace/skills/hooks-patterns/SKILL.md +185 -0
  186. package/marketplace/skills/http-semantics/SKILL.md +136 -0
  187. package/marketplace/skills/ideation/SKILL.md +41 -0
  188. package/marketplace/skills/indexing-strategy/SKILL.md +108 -0
  189. package/marketplace/skills/information-architecture/SKILL.md +59 -0
  190. package/marketplace/skills/integration-test-design/SKILL.md +111 -0
  191. package/marketplace/skills/intent-recognition/SKILL.md +136 -0
  192. package/marketplace/skills/interaction-feedback/SKILL.md +59 -0
  193. package/marketplace/skills/interaction-patterns/SKILL.md +59 -0
  194. package/marketplace/skills/journey-mapping/SKILL.md +41 -0
  195. package/marketplace/skills/keywords/SKILL.md +213 -0
  196. package/marketplace/skills/knowledge-modeling/SKILL.md +232 -0
  197. package/marketplace/skills/layout-composition/SKILL.md +59 -0
  198. package/marketplace/skills/linguistics/SKILL.md +429 -0
  199. package/marketplace/skills/lint-overlay/SKILL.md +76 -0
  200. package/marketplace/skills/mental-models/SKILL.md +126 -0
  201. package/marketplace/skills/merge-queue/SKILL.md +94 -0
  202. package/marketplace/skills/methodology/SKILL.md +317 -0
  203. package/marketplace/skills/microcopy/SKILL.md +232 -0
  204. package/marketplace/skills/middleware-patterns/SKILL.md +363 -0
  205. package/marketplace/skills/mobile-responsive-ux/SKILL.md +287 -0
  206. package/marketplace/skills/mutation-testing/SKILL.md +112 -0
  207. package/marketplace/skills/naming-conventions/SKILL.md +112 -0
  208. package/marketplace/skills/observability-modeling/SKILL.md +59 -0
  209. package/marketplace/skills/ontology-modeling/SKILL.md +67 -0
  210. package/marketplace/skills/owasp-security/SKILL.md +153 -0
  211. package/marketplace/skills/pattern-recognition/SKILL.md +472 -0
  212. package/marketplace/skills/performance-budgets/SKILL.md +185 -0
  213. package/marketplace/skills/performance-engineering/SKILL.md +58 -0
  214. package/marketplace/skills/performance-testing/SKILL.md +125 -0
  215. package/marketplace/skills/printify/SKILL.md +42 -0
  216. package/marketplace/skills/prioritization/SKILL.md +118 -0
  217. package/marketplace/skills/problem-framing/SKILL.md +41 -0
  218. package/marketplace/skills/problem-locating-solving/SKILL.md +203 -0
  219. package/marketplace/skills/project-knowledge-extraction/SKILL.md +54 -0
  220. package/marketplace/skills/prompt-craft/SKILL.md +134 -0
  221. package/marketplace/skills/prompt-injection-defense/SKILL.md +132 -0
  222. package/marketplace/skills/property-based-testing/SKILL.md +100 -0
  223. package/marketplace/skills/prototyping/SKILL.md +43 -0
  224. package/marketplace/skills/query-optimization/SKILL.md +144 -0
  225. package/marketplace/skills/real-time-updates/SKILL.md +324 -0
  226. package/marketplace/skills/ref-patterns/SKILL.md +284 -0
  227. package/marketplace/skills/refactor/SKILL.md +65 -0
  228. package/marketplace/skills/rendering-models/SKILL.md +142 -0
  229. package/marketplace/skills/replication-patterns/SKILL.md +110 -0
  230. package/marketplace/skills/research-synthesis/SKILL.md +41 -0
  231. package/marketplace/skills/route-handler-design/SKILL.md +347 -0
  232. package/marketplace/skills/schema-evolution/SKILL.md +140 -0
  233. package/marketplace/skills/security-fundamentals/SKILL.md +139 -0
  234. package/marketplace/skills/semantic-center/SKILL.md +194 -0
  235. package/marketplace/skills/semantic-relations/SKILL.md +250 -0
  236. package/marketplace/skills/semantics/SKILL.md +366 -0
  237. package/marketplace/skills/semiotics/SKILL.md +230 -0
  238. package/marketplace/skills/seo-strategy/SKILL.md +260 -0
  239. package/marketplace/skills/server-actions-design/SKILL.md +243 -0
  240. package/marketplace/skills/server-components-design/SKILL.md +190 -0
  241. package/marketplace/skills/sharding-strategy/SKILL.md +123 -0
  242. package/marketplace/skills/shopify/SKILL.md +42 -0
  243. package/marketplace/skills/skill-infrastructure/SKILL.md +320 -0
  244. package/marketplace/skills/skill-router/SKILL.md +71 -0
  245. package/marketplace/skills/skill-scaffold/SKILL.md +105 -0
  246. package/marketplace/skills/snapshot-testing/SKILL.md +120 -0
  247. package/marketplace/skills/spec-driven-development/SKILL.md +148 -0
  248. package/marketplace/skills/state-machine-modeling/SKILL.md +56 -0
  249. package/marketplace/skills/state-management/SKILL.md +134 -0
  250. package/marketplace/skills/streaming-architecture/SKILL.md +194 -0
  251. package/marketplace/skills/summarization/SKILL.md +156 -0
  252. package/marketplace/skills/suspense-patterns/SKILL.md +265 -0
  253. package/marketplace/skills/system-interface-contracts/SKILL.md +59 -0
  254. package/marketplace/skills/task-analysis/SKILL.md +201 -0
  255. package/marketplace/skills/taxonomy-design/SKILL.md +66 -0
  256. package/marketplace/skills/test-coverage-strategy/SKILL.md +108 -0
  257. package/marketplace/skills/test-doubles-design/SKILL.md +98 -0
  258. package/marketplace/skills/test-driven-development/SKILL.md +96 -0
  259. package/marketplace/skills/testing-strategy/SKILL.md +67 -0
  260. package/marketplace/skills/theme-system-design/SKILL.md +43 -0
  261. package/marketplace/skills/tool-call-flow/SKILL.md +229 -0
  262. package/marketplace/skills/tool-call-strategy/SKILL.md +292 -0
  263. package/marketplace/skills/transaction-isolation/SKILL.md +98 -0
  264. package/marketplace/skills/type-safety/SKILL.md +177 -0
  265. package/marketplace/skills/typography-system/SKILL.md +43 -0
  266. package/marketplace/skills/usability-testing/SKILL.md +43 -0
  267. package/marketplace/skills/user-research/SKILL.md +43 -0
  268. package/marketplace/skills/vercel-composition-patterns/SKILL.md +157 -0
  269. package/marketplace/skills/version-control/SKILL.md +233 -0
  270. package/marketplace/skills/visual-design-foundations/SKILL.md +59 -0
  271. package/marketplace/skills/visual-hierarchy/SKILL.md +43 -0
  272. package/marketplace/skills/webhook-integration/SKILL.md +331 -0
  273. package/marketplace/skills/writing-humanizer/SKILL.md +380 -0
  274. package/package.json +67 -0
  275. package/schemas/manifest.schema.json +811 -0
  276. package/schemas/manifest.v2.schema.json +164 -0
  277. package/schemas/manifest.v3.schema.json +758 -0
  278. package/schemas/manifest.v4.schema.json +755 -0
  279. package/schemas/manifest.v5.schema.json +755 -0
  280. package/schemas/manifest.v6.schema.json +811 -0
  281. package/schemas/skill.context.jsonld +279 -0
  282. package/schemas/skill.schema.json +919 -0
  283. package/schemas/skill.v2.schema.json +201 -0
  284. package/schemas/skill.v3.schema.json +827 -0
  285. package/schemas/skill.v4.schema.json +822 -0
  286. package/schemas/skill.v5.schema.json +830 -0
  287. package/schemas/skill.v6.schema.json +946 -0
  288. package/schemas/vocabulary/keywords.json +180 -0
  289. package/schemas/vocabulary/workspace_tags.json +23 -0
  290. package/scripts/__tests__/migrate-skill-v2-to-v3.test.js +161 -0
  291. package/scripts/__tests__/migrate-skill-v3-to-v4.test.js +158 -0
  292. package/scripts/__tests__/test-export-parser-drift.js +149 -0
  293. package/scripts/__tests__/test-marketplace-export.js +114 -0
  294. package/scripts/__tests__/test-router-paths.js +82 -0
  295. package/scripts/__tests__/test-stability-promotion.js +244 -0
  296. package/scripts/__tests__/test-v3-1-alias-contract.js +109 -0
  297. package/scripts/__tests__/test-v3-1-skos-runtime.js +116 -0
  298. package/scripts/backfill-schema-version.js +198 -0
  299. package/scripts/build-field-reference.js +160 -0
  300. package/scripts/build-retrieval-baseline.js +511 -0
  301. package/scripts/check-markdown-links.js +211 -0
  302. package/scripts/check-protocol-consistency.js +979 -0
  303. package/scripts/export-marketplace-skills.js +610 -0
  304. package/scripts/export-skill.js +374 -0
  305. package/scripts/generate-manifest.js +787 -0
  306. package/scripts/lib/alias-contract.js +83 -0
  307. package/scripts/lib/audit-prompt-builder.js +771 -0
  308. package/scripts/lib/mock-grader.js +134 -0
  309. package/scripts/lib/parse-frontmatter.js +429 -0
  310. package/scripts/lib/roots.js +119 -0
  311. package/scripts/lint/check-archetype-sections.js +185 -0
  312. package/scripts/lint/check-category-enum.js +83 -0
  313. package/scripts/lint/check-routing-eval.js +146 -0
  314. package/scripts/lint/check-routing-quality.js +211 -0
  315. package/scripts/lint/check-stability-promotion.js +220 -0
  316. package/scripts/lint/format-code-frame.js +206 -0
  317. package/scripts/marketplace-install.js +125 -0
  318. package/scripts/migrate-category-to-enum.js +169 -0
  319. package/scripts/migrate-skill-v2-to-v3.js +424 -0
  320. package/scripts/migrate-skill-v3-to-v4.js +200 -0
  321. package/scripts/migrate-skill-v5-to-v6.js +304 -0
  322. package/scripts/restructure-by-category.js +85 -0
  323. package/scripts/seed-publication-classification.js +282 -0
  324. package/scripts/skill-audit.js +893 -0
  325. package/scripts/skill-graph-drift.js +483 -0
  326. package/scripts/skill-graph-route.js +766 -0
  327. package/scripts/skill-graph-routing-eval.js +393 -0
  328. package/scripts/skill-lint.js +1317 -0
  329. package/scripts/skill-overlap.js +213 -0
  330. package/scripts/verify-skill-md-export.js +201 -0
@@ -0,0 +1,66 @@
1
+ # Skill Retrieval Evidence
2
+
3
+ > Status: research notes for positioning and roadmap work.
4
+ > Last checked: 2026-05-13.
5
+
6
+ This note collects source-backed claims about skill and tool retrieval. Use it
7
+ when explaining why Skill Graph exists: large skill libraries need more than
8
+ names and short descriptions. They need full skill text, structured metadata,
9
+ relations, evals, grounding, and repeatable routing metrics.
10
+
11
+ ## Evidence Bank
12
+
13
+ | Source | What the source says | Skill Graph implication |
14
+ |---|---|---|
15
+ | SkillRouter, arXiv:2603.22455 | Large skill registries make it infeasible to expose every skill at inference time. The paper reports that hiding full skill bodies caused a 31-44 percentage-point routing accuracy drop on an approximately 80K-skill benchmark, then proposes full-text retrieve-and-rerank routing. | Skill Graph should not optimize for `name` + `description` routing. The project should make full skill records easier to index, evaluate, rerank, and govern. |
16
+ | SkillRet, arXiv:2605.05726 | Skill retrieval remains underexplored and realistic retrieval is still far from solved. The benchmark has 17,810 public agent skills, 63,259 training samples, and 4,997 evaluation queries; task-specific retrieval training materially improves NDCG@10. | Skill Graph can be the structure layer for benchmarkable, trainable skill retrieval: taxonomy, semantic tags, examples, anti-examples, and eval state all become supervised signals. |
17
+ | ToolRet, arXiv:2503.01763 | Tool retrieval from large toolsets is a critical first step for LLM agents. The paper finds that strong conventional IR models perform poorly on tool retrieval and that low retrieval quality hurts task pass rate. | Skill routing is a real systems problem, not just prompt wording. Skill Graph should measure retrieval quality directly and treat routing errors as product failures. |
18
+ | Tool-to-Agent Retrieval, arXiv:2511.01854 | Routing through coarse agent descriptions can hide fine-grained tool capabilities. The paper improves retrieval by representing tools and parent agents in a shared vector space and traversing metadata relationships. | Skill Graph's relation edges and metadata are useful routing infrastructure, especially when a query matches a fine-grained capability that a coarse description would miss. |
19
+ | ToolLLM, arXiv:2307.16789 | ToolLLM collected 16,464 APIs and equipped the model with a neural API retriever so tools do not need to be selected manually. | Retrieval is part of scalable tool and skill ecosystems. Skill Graph should position itself as the contract that makes retrieval records explicit, auditable, and portable. |
20
+
21
+ ## Positioning Statements
22
+
23
+ Use these as careful, source-backed positioning, not as final marketing copy:
24
+
25
+ - Skill retrieval is now a first-class agent infrastructure problem.
26
+ - Short descriptions are not enough for large or overlapping skill libraries.
27
+ - Full skill bodies carry routing signal that metadata-only systems miss.
28
+ - Structured metadata is still essential: it supplies filters, trust signals,
29
+ boundaries, eval labels, grounding, and graph edges around full-text retrieval.
30
+ - Skill Graph turns a folder of Markdown skills into retrieval-ready records:
31
+ title, description, body, examples, anti-examples, paths, taxonomy, relations,
32
+ eval state, grounding, portability, and freshness.
33
+ - Skill Graph is not competing with learned retrieval. It gives learned
34
+ retrieval better records, better labels, and better governance.
35
+
36
+ ## Claims To Avoid
37
+
38
+ - Do not claim that frontmatter alone solves skill retrieval.
39
+ - Do not claim that `name` + `description` is an adequate production router for
40
+ serious libraries.
41
+ - Do not claim that deterministic metadata routing beats trained rerankers at
42
+ large scale unless this repo has measured that result.
43
+ - Do not cite routing metrics without naming the benchmark, skill pool size,
44
+ and evaluation split.
45
+
46
+ ## Product Direction
47
+
48
+ The strongest Skill Graph direction is a hybrid:
49
+
50
+ 1. Make each skill a high-quality retrieval record: `name`, `description`, full
51
+ body, examples, anti-examples, paths, tags, relations, eval status, and
52
+ grounding.
53
+ 2. Keep deterministic lint and protocol consistency checks as the contract gate.
54
+ 3. Add routing evals that produce confusion pairs, false-positive rates, and
55
+ coverage gaps.
56
+ 4. Support full-text retrieve-and-rerank over skill bodies.
57
+ 5. Use Skill Graph metadata as filters, labels, trust signals, and graph
58
+ post-processing around learned retrieval.
59
+
60
+ ## Sources
61
+
62
+ - SkillRouter: Skill Routing for LLM Agents at Scale - <https://arxiv.org/abs/2603.22455>
63
+ - SkillRet: A Large-Scale Benchmark for Skill Retrieval in LLM Agents - <https://arxiv.org/abs/2605.05726>
64
+ - Retrieval Models Aren't Tool-Savvy: Benchmarking Tool Retrieval for Large Language Models - <https://arxiv.org/abs/2503.01763>
65
+ - Tool-to-Agent Retrieval: Bridging Tools and Agents for Scalable LLM Multi-Agent Systems - <https://arxiv.org/abs/2511.01854>
66
+ - ToolLLM: Facilitating Large Language Models to Master 16000+ Real-world APIs - <https://arxiv.org/abs/2307.16789>
@@ -0,0 +1,471 @@
1
+ # Skill Metadata Protocol Rationale
2
+
3
+ This is the rationale and deep explanation for the Skill Metadata Protocol. For normative authoring rules, start with [`SKILL_METADATA_PROTOCOL.md`](https://github.com/jacob-balslev/skill-metadata-protocol); this document explains why the protocol has this shape and how the pieces fit together.
4
+
5
+ Skill Metadata Protocol is the **skill-level contract** for AI SKILL.md. It defines the structured relevance metadata a skill should declare: activation signals, taxonomy, project/file scope, sibling-skill relations, grounding, drift checks, eval state, and portability.
6
+
7
+ Skill Graph is the **library-level system** that works with this protocol. It indexes, routes, clusters, audits, and reverifies libraries of Skill-Metadata-Protocol-enriched skills.
8
+
9
+ > **Migrating from an older schema?** Jump straight to the migration notes:
10
+ > - **v5 → v6** — flattens the `concept` block to top-level `mental_model`, `purpose`, `boundary`, `analogy`, `misconception`; adds the Health block (`last_audited`, `last_changed`, `audit_verdict`, `eval_score`, `eval_failed_ids`, `lint_verdict`, `drift_status`) so a skill's audit fingerprint lives in its own frontmatter. Legacy `concept` block remains accepted for v5 skills not yet migrated. See `migrations/v5-to-v6.md`.
11
+ > - **v4 → v5** — closes the `category` field to a 6-value enum
12
+ > - [v2 → v3](manifest-field-mapping.md#migration-note--v2--v3-v040) — `drift_check` scalar → object, `compatibility` scalar → object, `family` → `category`, new optional fields
13
+ > - [v1 → v2](manifest-field-mapping.md#migration-note--v1--v2-2026-04-17-sh-5784) — `scope` enum rename, `eval_status` split into three fields, `route_bundles` → `routing_bundles`
14
+ > - Codemod: `node scripts/migrate-skill-v2-to-v3.js` upgrades v2 skills in place. `scripts/migrate-skill-v5-to-v6.js` (backfill mode) populates the new flat fields from the legacy `concept` block.
15
+
16
+ ## Related Documents
17
+
18
+ | Document | Purpose |
19
+ |---|---|
20
+ | [`SKILL_METADATA_PROTOCOL.md`](https://github.com/jacob-balslev/skill-metadata-protocol) | Normative public spec: required fields, semantic rules, authored vs generated fields, migration notes |
21
+ | `docs/skill-metadata-protocol.md` (this file) | Rationale and deep explanation: archetype map, requiredness groups, schema strictness rules, design tradeoffs |
22
+ | `docs/field-reference.md` | One section per authored field — purpose, rules, examples, when to use |
23
+ | `docs/field-decision-guide.md` | Decision tables for `scope`, `relations.*`, and the eval-health fields (`eval_artifacts`, `eval_state`, `routing_eval`) / `portability` |
24
+ | `docs/concept-map.md` | Teaching map — 36 authored fields grouped by conceptual role; drift log vs earlier framings |
25
+ | `docs/manifest-field-mapping.md` | Authored-to-generated bridge: rename map, loss policy, worked example |
26
+ | `docs/adr/` | Architecture decision records — 0001 predicate set, 0002 JSON-LD @context, 0003 OntoClean rigidity tags, 0004 persistent identifiers |
27
+ | `schemas/skill.context.jsonld` | JSON-LD @context mapping every authored field to W3C vocabularies (SKOS, Dublin Core, PROV-O) |
28
+ | `schemas/vocabulary/` | Controlled vocabularies for `keywords` (canonical + synonyms) and `workspace_tags` (literal handles + semantic tags) — advisory, surfaced as lint warnings |
29
+
30
+ ## Design Principles
31
+
32
+ This document is the public source of truth for the Skill Metadata Protocol frontmatter format. Every design decision is in service of a benefit a working developer feels:
33
+
34
+ - **Keeps a flat author-facing frontmatter format** → you can author skills in plain YAML — no nested syntax to remember, no DSL to learn
35
+ - **Keeps one `SKILL.md` file per skill** → a skill's everything-you-need-to-know lives at one path; no parallel sidecar files to keep in sync
36
+ - **Keeps one generated manifest downstream** → consumers read a single deterministic artifact; the manifest is content-addressable and CI-verifiable
37
+ - **Tightens field semantics** → lint catches you when `relations.depends_on` points at a skill that doesn't exist, instead of silently breaking the router at runtime
38
+ - **Adds a small number of high-value fields beyond the SKILL.md base** → typed relations, drift detection, and project scoping become declarative metadata rather than tribal knowledge
39
+ - **Stays additive to the SKILL.md standard so every protocol-enriched skill can be transformed back to the base shape** → adopting the protocol does not trap you; the export transform at `scripts/export-skill.js` produces a valid SKILL.md file
40
+
41
+ ### What kind of graph is this?
42
+
43
+ **In plain English:** Skill Metadata Protocol lets one skill say *"I depend on that one, verify me with this one, and stop routing users here when they really mean that other one."* The relation predicates (`depends_on`, `verify_with`, `boundary`, `adjacent`, `related`, `broader`, `narrower`, `disjoint_with`) are the typed edges that Skill Graph can use to turn a skill collection into a graph an agent can reason over.
44
+
45
+ Skill Graph is a **property graph with a controlled-vocabulary set of typed predicates**, not an RDF knowledge graph. Nodes are skills; edges are keys inside `relations.*`; node attributes are the 36 canonical authored frontmatter fields. The JSON-LD `@context` at `schemas/skill.context.jsonld` projects the property graph into SKOS / Dublin Core Terms / PROV-O triples for consumers that want RDF semantics, but authoring stays in flat YAML.
46
+
47
+ Skill Graph does **not** promise:
48
+
49
+ - Automated inference (no OWL reasoner runs against the graph)
50
+ - Open-world consistency checking (the schema closes it via `additionalProperties: false`)
51
+ - SPARQL queryability as the primary interface (get that by applying the JSON-LD `@context` first)
52
+
53
+ What it does promise: deterministic lint, manifest generation, relation-aware routing, drift detection against content-addressable truth sources, and portable export to SKILL.md.
54
+
55
+ ### Drift-check hash semantics
56
+
57
+ `drift_check.truth_source_hashes` maps each normalized truth-source key to the **SHA-256 hex digest** at the time of last verification. String truth sources hash the whole local file under `path`; object truth sources can narrow the hash to `path#Lstart-Lend` for a line range or `path#anchor` for a Markdown heading slug / literal-text anchor. Local file content is normalized to LF before hashing so CRLF-only edits do not create false drift. The drift sentinel (`scripts/skill-graph-drift.js`) reports `DRIFT` when the live hash differs from the recorded hash, `BROKEN` when a declared local truth source is missing from disk, `STALE` when `today - drift_check.last_verified > lifecycle.stale_after_days`, `NO_BASELINE` when local truth sources are declared but no hashes are recorded, and `EXTERNAL_UNHASHED` when a URL truth source is a valid reference but is not fetched by the zero-dependency sentinel. To add a local-file baseline: `node scripts/skill-graph-drift.js --record --apply <skill-path>`.
58
+
59
+ ### Overlay composition precedence
60
+
61
+ When `type: overlay` and `extends: <parent-skill>`, the overlay's authored fields **override** the parent's fields on a per-field basis. There is no field-level merge — a field present on the overlay replaces the same field on the parent entirely. The overlay body sections (`## Coverage`, `## Overlay Rules`, `## Extends`, `## Do NOT Use When`) stand on their own and do not inherit prose from the parent. This mirrors OntoClean specialisation: the overlay is anti-rigid (-R) and existentially dependent (+D) on the parent, but the overlay's *content* is authoritative within its own SKILL.md (ADR 0003). Consumers resolving an overlay at routing time:
62
+
63
+ 1. Load the overlay's frontmatter as the effective skill metadata.
64
+ 2. Treat the parent's metadata as context — available for reference but not merged.
65
+ 3. Apply the overlay's `## Overlay Rules` as modifications to the parent's behaviour, scoped to the overlay's `## Coverage`.
66
+
67
+ If an overlay needs to *add* rather than *replace* a field's value (e.g. add keywords), author the full intended set in the overlay — the schema does not offer additive inheritance. Future work under ADR 0001 may introduce explicit merge strategies; today the rule is overlay-wins-per-field.
68
+
69
+ ## Relationship to the SKILL.md Standard
70
+
71
+ > **This added structure is the price of making skills verifiable and system-aware once descriptions alone stop being enough.** If your library is small enough that descriptions and keywords are sufficient, stay on plain SKILL.md — Skill Metadata Protocol's additional fields are overhead without payoff until the implicit graph appears.
72
+
73
+ Skill Metadata Protocol extends the [SKILL.md](https://agentskills.io/specification) open standard with a richer authoring contract. The base standard requires two frontmatter fields (`name` and `description`) and defines four optional fields (`license`, `compatibility`, `metadata`, `allowed-tools`). The protocol keeps the two required base fields and three of the four optional base fields (`license`, `compatibility`, `allowed-tools`) as top-level fields — though `compatibility` is tightened from a free-text string to a structured object, and `name` allows `/` and `:` for namespacing. It does not use the base `metadata` field; protocol extensions are promoted to additional named top-level fields instead.
74
+
75
+ A Skill-Metadata-Protocol-enriched `SKILL.md` is *not* automatically a valid SKILL.md file: the `compatibility` shape and `name` pattern diverge. The export transform at `scripts/export-skill.js` produces a `SKILL.skill-md.md` that is valid against the base standard — flattening `compatibility` to a string and nesting protocol extension fields under the base `metadata:` key. Round-trip parity is via the export transform, not via direct schema compatibility.
76
+
77
+ | Field | Source | Skill Metadata Protocol treatment |
78
+ |---|---|---|
79
+ | `name` | SKILL.md required | Kept as required; the protocol tightens the character pattern |
80
+ | `description` | SKILL.md required | Kept as required; scoped to routing |
81
+ | `license` | SKILL.md optional | Kept top-level; strongly recommended for shared skills |
82
+ | `compatibility` | SKILL.md optional | Kept top-level; optional |
83
+ | `allowed-tools` | SKILL.md optional | Kept top-level as a space-separated string |
84
+ | `metadata` | SKILL.md optional | Not used at the top level; the protocol promotes extensions to named fields |
85
+ | `schema_version`, `version`, `type`, `category`, `scope`, `owner`, `freshness`, `drift_check`, `eval_artifacts`, `eval_state`, `routing_eval` | Skill Metadata Protocol extension | Required by the protocol; additive to the base |
86
+ | `relations`, `grounding`, `portability`, `triggers`, `keywords`, `examples`, `anti_examples`, `paths`, `workspace_tags`, `domain`, `routing_bundles`, `lifecycle`, `runtime_telemetry`, `extends`, `stability`, `superseded_by` | Skill Metadata Protocol extension | Optional protocol enrichments; additive to the base |
87
+
88
+ A Skill-Metadata-Protocol-enriched `SKILL.md` is **not** a valid SKILL.md file as authored, because the protocol requires fields the base standard does not define. An export transform can produce an SKILL.md-valid file by moving every protocol extension field under the standard `metadata:` key. The transform is implemented as `scripts/export-skill.js`.
89
+
90
+ ## Archetype Section Map
91
+
92
+ Each skill archetype expects a specific set of body H2 sections. These are the minimum required sections per archetype. Additional sections are allowed when they earn their line count.
93
+
94
+ | Archetype | Required H2 sections | Example for a real project |
95
+ |---|---|---|
96
+ | `capability` | `## Coverage`, `## Philosophy`, `## Verification`, `## Do NOT Use When` | [`markdown-post-frontmatter-validation`](../examples/projects/markdown-static-site/skills/markdown-post-frontmatter-validation/SKILL.md) — codebase-grounded with full `grounding` block |
97
+ | `workflow` | `## Coverage`, `## Philosophy`, `## Workflow`, `## Verification`, `## Do NOT Use When` | [`migrate-posts-to-v2-frontmatter`](../examples/projects/markdown-static-site/skills/migrate-posts-to-v2-frontmatter/SKILL.md) — codebase-grounded; demonstrates the four-phase add-required-field workflow with dry-run gate |
98
+ | `router` | `## Coverage`, `## Routing Rules`, `## Do NOT Use When` | [`content-source-router`](../examples/projects/markdown-static-site/skills/content-source-router/SKILL.md) — dispatches between local markdown / MDX / CMS-synced sources by file extension or content-path prefix |
99
+ | `overlay` | `## Coverage`, `## Overlay Rules`, `## Extends` (name of the base skill), `## Do NOT Use When` | [`lint-overlay`](https://github.com/jacob-balslev/skills/blob/main/skills/lint-overlay/SKILL.md) extends [`testing-strategy`](https://github.com/jacob-balslev/skills/blob/main/skills/testing-strategy/SKILL.md) — adds lint-specific gate placement on top of the base verification framework |
100
+
101
+ `## Key Files` is recommended for skills that reference concrete repo files. Prefer file paths with line ranges (`src/foo.ts:45-120`) over bare paths when the skill depends on a specific function or section. `## References` is recommended for skills that point at external reading.
102
+
103
+ ### Relationship to wider skill-authoring doctrine
104
+
105
+ This archetype map is Skill Metadata Protocol's own minimum. When the protocol is adopted into a monorepo that already has a canonical authoring standard (e.g., a `canonical-standard` or `skill-scaffold` skill), the adopter's standard may impose additional required sections or stricter content rules on top of this map. Skill Metadata Protocol does not replace such a standard — it provides the portable subset that every skill must satisfy regardless of which adopter's fuller doctrine also applies. If you are adopting Skill Graph into a repo with a `canonical-standard` skill, reference that skill's archetype canon instead of republishing a narrower one in your own repo docs.
106
+
107
+ ## Requiredness Groups
108
+
109
+ These groups are documentation categories only. They do not require nested YAML.
110
+
111
+ ### Required for all skills
112
+
113
+ ```yaml
114
+ schema_version
115
+ name
116
+ description
117
+ version
118
+ type
119
+ category
120
+ scope
121
+ owner
122
+ freshness
123
+ drift_check
124
+ eval_artifacts
125
+ eval_state
126
+ routing_eval
127
+ ```
128
+
129
+ ### Strongly recommended
130
+
131
+ Not schema-required, but most useful skills include these:
132
+
133
+ ```yaml
134
+ stability
135
+ license
136
+ relations
137
+ keywords
138
+ triggers
139
+ ```
140
+
141
+ ### Required for specific skill classes
142
+
143
+ | Condition | Required field(s) |
144
+ |---|---|
145
+ | `type: overlay` | `extends` |
146
+ | `scope: codebase` | `grounding` (schema-enforced) |
147
+ | Routable skills (label or language activation) | `keywords`; `triggers` and `paths` when routing explicitly depends on them |
148
+
149
+ ### Optional enrichments
150
+
151
+ These improve portability, discoverability, and health tracking, but are not required for a valid Skill Metadata Protocol skill.
152
+
153
+ ```yaml
154
+ paths
155
+ workspace_tags
156
+ category
157
+ compatibility
158
+ allowed-tools
159
+ routing_bundles
160
+ portability
161
+ lifecycle
162
+ runtime_telemetry
163
+ ```
164
+
165
+ ## Template and Teaching Layer Discipline
166
+
167
+ Skill Metadata Protocol is the canonical contract, not the canonical template. The contract is the schema-backed set of fields, requiredness rules, relation semantics, grounding rules, and validation expectations. [`examples/skill-metadata-template.md`](../examples/skill-metadata-template.md) is a teaching artifact that demonstrates the contract for authors. A team can maintain its own stricter template as long as the resulting `SKILL.md` files still validate against the protocol.
168
+
169
+ ### Semantic layer discipline
170
+
171
+ Two fields look similar but serve opposite layers — sibling levels of progressive disclosure, not duplicates:
172
+
173
+ | Element | Layer | Purpose | Length |
174
+ |---|---|---|---|
175
+ | `description:` (frontmatter) | **Routing contract** | Tells the router "should this skill activate?" | ≤ 3 sentences |
176
+ | `## Coverage` (body section) | **Scope map** | Tells the reader, once the skill is loaded, what topics the skill covers | Bulleted topic list, ≥ 4 items for non-trivial skills |
177
+
178
+ If `description:` is bloated with scope detail, it will conflict with `## Coverage`. If `## Coverage` restates the description in one line, it has collapsed into the routing layer. Restore each to its proper layer when this happens.
179
+
180
+ ### Teaching layer delivery mechanisms
181
+
182
+ Meta-commentary aimed at the template reader must never live in an H2 header slot. AI agents adapting a template copy its H2 structure verbatim. That means meta sections like `## How To Read This Template` get cargo-culted into every new skill. The correct delivery mechanisms are:
183
+
184
+ - **`> **TEMPLATE NOTE:**` blockquotes** for body-level meta guidance (structurally distinct from H2 headers)
185
+ - **`# TEMPLATE NOTE:` inline YAML comments** for field-level meta guidance (disappears when an author tightens their frontmatter)
186
+ - **Never** put meta-commentary in an H2/H3 section header
187
+
188
+ ### When adapting the example template
189
+
190
+ 1. Restore `description:` to routing-only if it has drifted into scope description.
191
+ 2. Keep the H2 structure that matches the skill archetype (see **Archetype section map** above).
192
+ 3. Replace example values only with equally real, context-correct values.
193
+ 4. Remove sections that are conditionally irrelevant rather than keeping them with fake content.
194
+ 5. Leave `> **TEMPLATE NOTE:**` blockquotes and `# TEMPLATE NOTE:` YAML comments out of the new skill — they are authoring scaffolding, not skill content.
195
+
196
+ ### Title casing convention
197
+
198
+ The H1 title at the top of each SKILL.md body is Title Case — every significant word capitalized — and it is the human-readable expansion of `name:`, not a duplicate. Single-word skills (`debugging` → `# Debugging`) capitalize the single word. Abbreviations and identifier-style names expand to their human form (`a11y` → `# Accessibility`, `graph-audit` → `# Graph Audit`). The `name:` field stays lowercase and hyphenated; the H1 is never used as a graph identifier.
199
+
200
+ ### Description opener convention
201
+
202
+ Every `description:` field leads with a trigger clause — `"Use when …"` or an equivalent imperative — and names at least one explicit negative boundary with `"Do NOT use for …"`. Do not lead with the skill's own name as a noun (`"Debugging skill for …"`); the router already knows the name from the `name:` field, so the opener should spend its budget on when the skill activates, not on self-reference. A good opener names (a) the triggering situation, (b) the scope the skill covers, and (c) at least one concrete case where a different skill is correct instead.
203
+
204
+ ## Anatomy
205
+
206
+ > **The question this diagram answers:** "What are the parts of a SKILL.md?"
207
+
208
+ Every Skill Graph SKILL.md is the same shape: a YAML frontmatter, a Markdown body, and — only in the canonical template specimen — a teaching layer that is stripped when the template is adapted. The field-level detail lives in the table below the diagram and in [`docs/field-reference.md`](field-reference.md); the archetype → required-section mapping lives in the [Archetype Section Map](#archetype-section-map) above. This diagram shows only the compositional shape.
209
+
210
+ ```mermaid
211
+ flowchart LR
212
+ Skill(["<b>SKILL.md</b>"])
213
+ FM["<b>YAML Frontmatter</b><br/>33 named fields · machine-validated"]
214
+ Body["<b>Markdown Body</b><br/>H2 sections depend on <code>type</code>"]
215
+ Teach["<b>Teaching Layer</b><br/>TEMPLATE NOTE scaffolding<br/>template specimen only"]
216
+
217
+ Skill --> FM
218
+ Skill --> Body
219
+ Skill -.->|optional| Teach
220
+
221
+ classDef file fill:#dbeafe,stroke:#2563eb,color:#1e3a8a,font-weight:bold
222
+ classDef layer fill:#ecfdf5,stroke:#047857,color:#064e3b
223
+ classDef optional fill:#fef3c7,stroke:#d97706,color:#78350f,stroke-dasharray:4 2
224
+ class Skill file
225
+ class FM,Body layer
226
+ class Teach optional
227
+ ```
228
+
229
+ <!-- Rendered copy for non-Mermaid viewers. Regenerate via: npx @mermaid-js/mermaid-cli -i <source> -o docs/images/skill-anatomy.png -->
230
+ <img src="./images/skill-anatomy.png" alt="Skill anatomy — SKILL.md decomposes into YAML Frontmatter plus Markdown Body, with an optional Teaching Layer that only exists in the canonical template specimen" width="720" />
231
+
232
+ **Legend.** Blue = the file. Green = a required layer. Yellow dashed = an optional / specimen-only layer.
233
+
234
+ ### The 54 authored fields, grouped by purpose
235
+
236
+ The YAML frontmatter has 54 top-level fields in the current v6 schema, including compatibility aliases that remain accepted for migration, the seven flat fields (5 Understanding + 7 Health) added in v6, and the two publication-facet fields (`secondary_categories`, `marketplace_tier`) added in the May 2026 skill-org reorganization. The schema is the authoritative source for types and requiredness (`schemas/skill.v6.schema.json`); the canonical per-field reference is [`docs/field-reference.md`](field-reference.md). The table below is a navigable index. `always` = required by the base schema; `if <condition>` = conditionally required; blank = optional enrichment.
237
+
238
+ **v6 simplification (2026-05-17).** v6 flattens the seven-field `concept` block to top-level so the Understanding fields read like every other field in the Protocol. It also adds the **Health block** — seven flat fields (`last_audited`, `last_changed`, `audit_verdict`, `eval_score`, `eval_failed_ids`, `lint_verdict`, `drift_status`) — so a skill's audit fingerprint lives in its own frontmatter instead of scattered across `eval-history.jsonl`, `health-ledger.jsonl`, and `.opencode/progress/skill-audit-*`. The Skill Audit Loop reads these flat Health fields directly; no log-file crawl required.
239
+
240
+ | Group | Field | Required? | Shape |
241
+ |---|---|---|---|
242
+ | **Identity** | [`name`](field-reference.md#name) | always | string |
243
+ | | [`urn`](field-reference.md#urn) | | persistent `urn:skill:<repo>:<skill-name>` identifier |
244
+ | | [`description`](field-reference.md#description) | always | string |
245
+ | | [`version`](field-reference.md#version) | always | semver string |
246
+ | | [`owner`](field-reference.md#owner) | always | string |
247
+ | **Classification** | [`schema_version`](field-reference.md#schema_version) | always | integer `4` |
248
+ | | [`type`](field-reference.md#type) | always | `capability` \| `workflow` \| `router` \| `overlay` |
249
+ | | [`scope`](field-reference.md#scope) | always | `codebase` \| `reference` \| `portable` |
250
+ | | [`category`](field-reference.md#category) | always | string |
251
+ | | [`domain`](field-reference.md#domain) | | hierarchical path |
252
+ | | [`secondary_categories`](field-reference.md#secondary_categories) | | string[] (max 2, drawn from the `category` enum; for marketplace cross-listing only — does not affect filesystem placement) |
253
+ | | [`stability`](field-reference.md#stability) | | `experimental` \| `stable` \| `deprecated` |
254
+ | | [`superseded_by`](field-reference.md#superseded_by) | if `stability: deprecated` | skill name |
255
+ | | [`marketplace_tier`](field-reference.md#marketplace_tier) | | `S` \| `A` \| `B` \| `C` (omit for unpublished; sourced from publication-priority docs) |
256
+ | **Health & Drift** | [`freshness`](field-reference.md#freshness) | always | ISO date |
257
+ | | [`drift_check`](field-reference.md#drift_check) | always | `{ last_verified, truth_source_hashes? }` |
258
+ | | [`lifecycle`](field-reference.md#lifecycle) | | `{ stale_after_days, review_cadence }` |
259
+ | | [`runtime_telemetry`](field-reference.md#runtime_telemetry) | | `{ feedback_source, metrics }` |
260
+ | **Health Block** (v6+, flat) | [`last_audited`](field-reference.md#last_audited) | | ISO date |
261
+ | | [`last_changed`](field-reference.md#last_changed) | | ISO date |
262
+ | | [`audit_verdict`](field-reference.md#audit_verdict) | | `PASS` \| `PASS_WITH_FIXES` \| `PARTIAL` \| `FAIL` \| `UNKNOWN` |
263
+ | | [`eval_score`](field-reference.md#eval_score) | | number 0.0–5.0 |
264
+ | | [`eval_failed_ids`](field-reference.md#eval_failed_ids) | | string[] |
265
+ | | [`lint_verdict`](field-reference.md#lint_verdict) | | `PASS` \| `FAIL` \| `UNKNOWN` |
266
+ | | [`drift_status`](field-reference.md#drift_status) | | `OK` \| `DRIFT` \| `BROKEN` \| `STALE` \| `NO_BASELINE` \| `EXTERNAL_UNHASHED` \| `UNKNOWN` |
267
+ | **Eval Health** (orthogonal triple) | [`eval_artifacts`](field-reference.md#eval_artifacts) | always | `present` \| `planned` \| `none` |
268
+ | | [`eval_state`](field-reference.md#eval_state) | always | `unverified` \| `passing` \| `monitored` |
269
+ | | [`routing_eval`](field-reference.md#routing_eval) | always | `present` \| `absent` |
270
+ | | [`comprehension_state`](field-reference.md#comprehension_state) | | `present` \| `absent` |
271
+ | **Understanding** (v6+, flat) | [`mental_model`](field-reference.md#mental_model) | if `comprehension_state: present` | string |
272
+ | | [`purpose`](field-reference.md#purpose) | if `comprehension_state: present` | string |
273
+ | | [`boundary`](field-reference.md#boundary) | if `comprehension_state: present` | string |
274
+ | | [`analogy`](field-reference.md#analogy) | if `comprehension_state: present` | string |
275
+ | | [`misconception`](field-reference.md#misconception) | if `comprehension_state: present` | string |
276
+ | | [`concept`](field-reference.md#concept) | DEPRECATED in v6 | `{ definition, mental_model, purpose, boundary, taxonomy, analogy, misconception }` — legacy v5 shape, accepted for back-compat |
277
+ | | [`eval_last_run`](field-reference.md#eval_last_run) | | `{ at, status, runner?, model?, receipt?, receipt_hash? }` |
278
+ | **Activation & Routing** | [`keywords`](field-reference.md#keywords) | if routable | string[] |
279
+ | | [`triggers`](field-reference.md#triggers) | | string[] |
280
+ | | [`paths`](field-reference.md#paths) | | glob[] |
281
+ | | [`examples`](field-reference.md#examples) | | string[] (positive prompts) |
282
+ | | [`anti_examples`](field-reference.md#anti_examples) | | string[] (negative prompts) |
283
+ | | [`workspace_tags`](field-reference.md#workspace_tags) | | string[] |
284
+ | | [`routing_bundles`](field-reference.md#routing_bundles) | | string[] |
285
+ | **Relations** | [`relations`](field-reference.md#relations) | | `{ adjacent, related, broader, narrower, boundary, disjoint_with, verify_with, depends_on }` |
286
+ | **Grounding** | [`grounding`](field-reference.md#grounding) | if `scope: codebase` | `{ domain_object, grounding_mode, truth_sources, failure_modes, evidence_priority }` |
287
+ | **Portability & Standards** | [`portability`](field-reference.md#portability) | | `{ readiness, targets }` |
288
+ | | [`license`](field-reference.md#license) | | SPDX identifier |
289
+ | | [`compatibility`](field-reference.md#compatibility) | | `{ runtimes?, node?, notes? }` |
290
+ | | [`allowed-tools`](field-reference.md#allowed-tools) | | space-separated string |
291
+ | | [`extends`](field-reference.md#extends) | if `type: overlay` | skill name |
292
+
293
+ **Conditional requiredness in one line:** `keywords` when the skill is routable, `extends` when `type: overlay`, `grounding` when `scope: codebase`, `superseded_by` when `stability: deprecated`. The schema enforces the latter three via `allOf`; lint enforces the `keywords` routability rule. For the decision tables that help you choose between `capability` / `workflow` / `router` / `overlay` or between `codebase` / `reference` / `portable`, see [`docs/field-decision-guide.md`](field-decision-guide.md).
294
+
295
+ ## Why archetypes are rigid vs anti-rigid (OntoClean per ADR 0003)
296
+
297
+ The four `type` values — `capability`, `workflow`, `router`, `overlay` — are not interchangeable buckets. They partition the skill space along the OntoClean rigidity axis (Guarino & Welty 2002), which is why ADR 0003 tags each archetype as either RIGID, ANTI-RIGID, or DEPENDENT.
298
+
299
+ | Archetype | Rigidity tag | What it means |
300
+ |---|---|---|
301
+ | `capability` | **Rigid** | A capability skill's identity is intrinsic. "Web accessibility (a11y)" is a stable concept; an entity that is a `capability` cannot stop being a `capability` without ceasing to exist as the same skill. |
302
+ | `workflow` | **Rigid** | Same as capability — a workflow's identity is the procedure it teaches. "Code review" stops being "code review" only by being deleted, not by changing type. |
303
+ | `router` | **Rigid** | A router's identity is its dispatch role; replacing the dispatch logic produces a different router skill, not the same router doing something else. |
304
+ | `overlay` | **Anti-rigid + Dependent** | An overlay's identity is INHERITED from the parent it `extends`. Without the parent, the overlay does not have a coherent identity on its own. The overlay is a specialisation, not a standalone skill. |
305
+
306
+ **Operationally, this is why changing a skill's `type` is not a harmless refactor**: it changes how downstream routers, eval graders, and reviewers interpret the skill. A type-change cascades into different routing behaviour, different eval interpretation, and different relation semantics — none of which surface as a syntax error, all of which produce subtly wrong agent behaviour.
307
+
308
+ The practical consequence is in **migration**: a rigid type cannot change at runtime without invalidating consumer assumptions. If a skill that consumers use as a `capability` is silently switched to `router`, the consumer's keyword scoring, eval interpretation, and routing-eval contract all break. Type changes therefore require a `superseded_by` chain — the old skill becomes `stability: deprecated` and a new skill takes the new type. Rigidity is the invariant that makes this discipline trustworthy.
309
+
310
+ The anti-rigid `overlay` is treated specially by the lint:
311
+
312
+ - An overlay must declare `extends: <parent-skill-name>`.
313
+ - The overlay's `## Coverage` should reference parent concepts (heuristic; lint check 14 OntoClean enforcement, ADR 0003).
314
+ - The overlay must NOT declare its own `relations.broader` or `relations.narrower` — those flow through `extends`.
315
+ - Deleting the parent invalidates every overlay that extended it; lint surfaces the dangling reference.
316
+
317
+ For cross-skill generalisation that is NOT existential dependency (i.e., the child is a coherent standalone skill that just happens to specialise a parent concept), use `relations.broader` instead of `extends`. `react-best-practices` has `broader: [frontend]` because react-best-practices remains coherent even if `frontend` were deleted; it is RIGID. The `extends`-vs-`broader` decision is the OntoClean test in everyday authoring.
318
+
319
+ **Read this when:** deciding `type:` for a new skill, deciding `extends:` vs `relations.broader:`, or judging whether a refactor that changes a skill's type is safe.
320
+
321
+ ## Why the eval-health triple is orthogonal (ADR 0001 + ADR 0006)
322
+
323
+ `eval_artifacts`, `eval_state`, and `routing_eval` are three fields that look like they could be one. They are deliberately separate because they answer three orthogonal questions about a skill's eval health:
324
+
325
+ | Question | Field | Values |
326
+ |---|---|---|
327
+ | Are eval files on disk? | `eval_artifacts` | `none` / `planned` / `present` |
328
+ | What does the eval say about content quality? | `eval_state` | `unverified` / `passing` / `monitored` |
329
+ | Is routing / trigger coverage explicitly evaluated? | `routing_eval` | `absent` / `present` |
330
+
331
+ Each axis has consumer-visible meaning. A consumer deciding whether to load a skill into an agent context can read all three and make a graded decision: high-quality content + verified routing > unverified content + verified routing > unverified content + absent routing. Conflating them would force the consumer to guess.
332
+
333
+ The orthogonality also expresses real states cleanly:
334
+
335
+ - `eval_artifacts: planned + eval_state: unverified` — the author intends to ship evals but hasn't yet; the planned-staleness guard (lint check 6) warns when this sits longer than 180 days.
336
+ - `eval_artifacts: present + eval_state: passing + routing_eval: absent` — content quality is verified but the router has never been tested against this skill's `examples[]`. Common during the early life of a skill.
337
+ - `eval_artifacts: present + eval_state: monitored + routing_eval: present` — fully verified along all three axes; the harness runs on a cadence and routing coverage is part of the eval set. The aspirational state.
338
+
339
+ Note the asymmetry: `routing_eval` is binary (`absent` / `present`) because the harness either agrees or it doesn't — there is no "monitored routing eval" because lint check 12 enforces routing-eval agreement at every lint run. `eval_state` is ternary because content evals can run once (`passing`) or repeatedly (`monitored`), and the difference is consumer-visible.
340
+
341
+ The "honesty over green checkmarks" rule (documented at `docs/field-reference.md § routing_eval`) governs the `routing_eval` flip specifically: an author cannot ship `routing_eval: present` until `node scripts/skill-graph-routing-eval.js --skill <name>` returns verdict PASS. Lint check 12 refuses the commit otherwise. The OSS starter library currently sits at all-8-`present` (verified by `node scripts/skill-graph-routing-eval.js --only-asserted`).
342
+
343
+ For the field-by-field rationale and worked-example confusion-cases, see [`docs/field-rationale.md`](field-rationale.md).
344
+
345
+ ## How JSON-LD context maps fields to W3C terms (ADR 0002)
346
+
347
+ Skill Metadata Protocol ships an optional JSON-LD `@context` at `schemas/skill.context.jsonld` that projects every authored field onto a W3C standard vocabulary term. This is the FAIR Interoperability layer (Wilkinson et al. 2016, DOI:10.1038/sdata.2016.18): a protocol-enriched skill loaded into a knowledge-graph consumer that already understands SKOS, PROV-O, OWL, or Dublin Core gets RDF-projectable semantics with no Skill-Metadata-Protocol-specific code.
348
+
349
+ The context is the source of truth for cross-vocabulary mapping. The most consequential mappings:
350
+
351
+ | Authored field | W3C term | Vocabulary | Why this term |
352
+ |---|---|---|---|
353
+ | `name` | `dcterms:identifier` | Dublin Core | Stable display-layer skill identity |
354
+ | `description` | `dcterms:description` | Dublin Core | Free-text subject summary |
355
+ | `version` | `dcterms:hasVersion` | Dublin Core | Skill content version (semver) |
356
+ | `freshness` | `dcterms:modified` | Dublin Core (xsd:date) | Author's claim of last-meaningful-review date |
357
+ | `category` | `skos:broader` | SKOS | Hierarchical category path projects to a skos:broader chain |
358
+ | `relations.related` / `adjacent` | `skos:related` | SKOS | Symmetric associative relation between concepts |
359
+ | `relations.broader` | `skos:broader` | SKOS | Cross-skill generalisation (target is more general) |
360
+ | `relations.narrower` | `skos:narrower` | SKOS | Cross-skill specialisation (target is more specific) |
361
+ | `relations.boundary` | `sg:disjointOwnership` | Skill-Graph custom | Routing-layer asymmetric handoff — intentionally weaker than OWL class-disjointness (per ADR 0006) |
362
+ | `relations.disjoint_with` | `owl:disjointWith` | OWL | Formal class-theoretic disjointness — distinct from `boundary` (per ADR 0006) |
363
+ | `relations.verify_with` | `prov:wasInformedBy` | PROV-O | Verifier skill informs this skill's claims |
364
+ | `relations.depends_on` | `dcterms:requires` | Dublin Core | Operational prerequisite |
365
+ | `extends` | `prov:wasDerivedFrom` | PROV-O | Overlay derivation relation |
366
+ | `grounding.truth_sources` | `dcterms:source` | Dublin Core | Source resources from which claims are derived |
367
+ | `urn` | `@id` | RFC 8141 + JSON-LD | Globally-unique persistent identifier |
368
+
369
+ The `boundary` vs `disjoint_with` split is the most semantically subtle entry. Per ADR 0006, `boundary` operates at the **routing layer** (the router uses it to redirect wrong-skill queries to the correct owner — asymmetric, directional) while `disjoint_with` operates at the **ontology layer** (formal class-disjointness — symmetric, reflexive). They are NOT aliases. Treating them as aliases — which ADR 0001 originally proposed — would force consumers to reason about routing claims as if they were ontological claims, which is unsound.
370
+
371
+ The `@context` also declares the `owl` namespace (since the v1.1.0 update) so the `disjoint_with` mapping resolves cleanly. The `_adr_anchors` block in the context file explicitly cross-references ADRs 0001, 0002, and 0006 so future maintainers see the reasoning for the split mapping in-tree, not only in commit history.
372
+
373
+ **Coverage policy:** ADR 0002 requires that every top-level authored field appears in `schemas/skill.context.jsonld`. Protocol consistency check C8 enforces this automatically, including declared JSON-LD namespace prefixes. When adding a top-level schema field, update the context mapping in the same change.
374
+
375
+ **Read this when:** adding a new top-level field, adding a new `relations.*` predicate, or considering whether to map an existing field to a different W3C term.
376
+
377
+ ## Schema Strictness
378
+
379
+ The Skill Metadata Protocol schemas are intentionally strict.
380
+
381
+ - Unknown top-level fields fail validation rather than being silently accepted.
382
+ - Field names must not rely on undocumented aliases.
383
+ - New public fields must be added by updating both the docs and the schemas.
384
+ - If you touched `docs/skill-metadata-protocol.md` or `schemas/skill.schema.json`, also update the other side so they remain in lockstep. Skill Metadata Protocol is the source of truth for semantics; the schema is the source of truth for machine enforcement. Drift between them is a bug.
385
+
386
+ ## Relationship to Audit Tooling
387
+
388
+ Skill Metadata Protocol is designed to work with:
389
+
390
+ 1. `SKILL_AUDIT_CHECKLIST.md`
391
+ 2. `SKILL_AUDIT_LOOP.md`
392
+
393
+ The metadata must support three things cleanly:
394
+
395
+ - activation
396
+ - relation-aware retrieval
397
+ - deterministic auditing
398
+
399
+ ## Non-Goals
400
+
401
+ This contract does not introduce:
402
+ - open-core vs closed-core runtime layers
403
+ - nested metadata requirements for authoring
404
+ - enterprise-only fields
405
+ - a second skill format
406
+ - a marketplace-specific packaging system
407
+
408
+ It also does not require a full private control plane. The OSS contract keeps only the metadata needed for a portable, graph-aware, lintable system.
409
+
410
+ ## Authored vs Generated Fields
411
+
412
+ ### Authored in `SKILL.md`
413
+
414
+ The 40 top-level authored fields are listed in `schemas/skill.schema.json`; aliases are included there so consumers can validate duplicate declarations consistently.
415
+
416
+ For the purpose, rules, and examples for each field, see `docs/field-reference.md`.
417
+
418
+ ### Generated in `skills.manifest.json`
419
+
420
+ - normalized category rollups
421
+ - health flags
422
+ - eval counts
423
+ - missing coverage flags
424
+ - mirror status
425
+ - compiled activation tables
426
+ - generated docs ownership
427
+
428
+ See `docs/manifest-field-mapping.md` for the full rename map, loss policy, migration policy, and a worked example showing the authored-to-generated projection field by field.
429
+
430
+ ## Schema Versioning Policy
431
+
432
+ Skill Graph uses a single integer `schema_version` to signal contract evolution. Current version: **6** (bumped from 5 in the v6 flat-fields simplification — concept block flattened, Health block added). The five policy points together define when `schema_version` bumps, what consumers should expect, and where migration tooling lives:
433
+
434
+ 1. **Breaking changes bump `schema_version`.** Renamed fields, removed fields, retyped fields, removed enum values, or tightened required-ness constraints bump the integer. Consumers must migrate or pin.
435
+ 2. **Additive changes do not bump.** New optional fields, new enum values that extend (not replace) an enum, and new checks in `scripts/skill-lint.js` that only affect warnings do not bump the version. Consumers on the prior minor release continue to pass.
436
+ 3. **Validate against the matching schema.** `schemas/skill.schema.json` and `schemas/manifest.schema.json` track the latest contract (v3 today). Pinned copies ship alongside them as `schemas/skill.v4.schema.json` and `schemas/manifest.v3.schema.json` — content-identical to the unversioned files except for `$id` and `title`. The prior-version pinned files (`schemas/skill.v2.schema.json`, `schemas/manifest.v2.schema.json`) remain in the repo for consumers pinned to v2. Consumers that want stability across a future v4 bump should validate against the versioned files; consumers that want to automatically follow the latest contract should validate against the unversioned files.
437
+ 4. **One-version-overlap deprecation is preferred.** `scripts/skill-lint.js` emits warnings (not errors) for v2-specific patterns (scalar `drift_check`, scalar `compatibility`, `family` field name) during the v3 window. Authors get a warning window to migrate. Hard-error enum/shape changes — rejected by `additionalProperties: false` + type constraints in the schema itself — are paired with the friendlier lint warning so the error points at the rename.
438
+ 5. **Migration tooling ships with the bump.** The v3 bump ships `scripts/migrate-skill-v2-to-v3.js`, a line-based codemod that preserves author YAML style (comments, quoting, indentation). Future bumps follow the same pattern: one codemod per version, shipped in the same PR.
439
+
440
+ For the concrete v2→v3 mapping tables, see `docs/manifest-field-mapping.md § Migration Note — schema_version 2 → 3`. For the v1→v2 tables (historical), see the same document. For field-level before/after pairs, see `docs/field-decision-guide.md`.
441
+
442
+ ### Health Block versioning (SH-6123)
443
+
444
+ **Health Block fields are v6-only.** The seven flat Health fields (`last_audited`, `last_changed`, `audit_verdict`, `eval_score`, `eval_failed_ids`, `lint_verdict`, `drift_status`) were introduced in v6. The lint schema (`schemas/skill.schema.json`, which tracks the latest contract) rejects these fields on any skill that lacks `schema_version: 6` because:
445
+
446
+ - `schemas/skill.v5.schema.json` uses `additionalProperties: false` and does not define the Health Block properties.
447
+ - The lint always validates against `skill.schema.json` (the v6 contract). Skills on v5 that contain Health Block fields must either be **bumped to v6** or have the Health Block fields stripped.
448
+
449
+ **Policy:** If the Skill Audit Loop walker stamps Health Block fields onto a skill whose frontmatter does not have `schema_version: 6`, the walker has written to the wrong schema tier. Correct the skill by running the v5→v6 migration script (`scripts/migrate-skill-v5-to-v6.js`) rather than adding an exception to the lint schema. Health Block fields are not universally applicable across schema versions; they are a v6+ contract.
450
+
451
+ ## Stability Promotion Criteria (SH-6109)
452
+
453
+ `stability: stable` signals that a skill's content is settled and suitable for production dependence. Lint check 14 (`scripts/lint/check-stability-promotion.js`) emits **WARN** (never ERROR) when a skill declares `stability: stable` without meeting the following five criteria. All criteria are evaluated independently — failures are reported for every unmet criterion, not just the first.
454
+
455
+ A skill qualifies for `stability: stable` when it meets all five of the following:
456
+
457
+ | # | Criterion | Field(s) | Pass condition |
458
+ |---|---|---|---|
459
+ | 1 | Eval has been run | `eval_state` | Value is `passing` or `monitored` (not `unverified` or absent) |
460
+ | 2 | Eval score meets quality bar | `eval_score` | ≥ 4.0 on the 0.0–5.0 audit scale (≡ 80%) |
461
+ | 3 | Routing coverage evaluated | `routing_eval` | Value is `present` (harness verified by lint check 12) |
462
+ | 4 | Drift verified recently | `drift_check.last_verified` | ISO 8601 date within the last 90 days |
463
+ | 5 | Truth sources declared | `grounding.truth_sources` | Non-empty array; exempt when `scope: portable` |
464
+
465
+ **Severity:** All findings from this check are warnings, not errors. This prevents 141 currently-experimental skills from breaking the lint run if any author prematurely sets `stability: stable`.
466
+
467
+ **When criterion 5 is exempt:** Skills with `scope: portable` have no codebase tie-in by definition. They are exempt from criterion 5 because `grounding.truth_sources` is not meaningful for portable skills.
468
+
469
+ **To promote a skill:** Satisfy each criterion, then change `stability: experimental` to `stability: stable`. The lint run will emit no stability-promotion warnings once all five criteria are met.
470
+
471
+ **Implementation:** `scripts/lint/check-stability-promotion.js`. Integrated into `scripts/skill-lint.js` as check 14 (warn-only track; also promoted to errors under `--strict`).
@@ -0,0 +1,80 @@
1
+ # skills.sh Maintainer Cleanup Request
2
+
3
+ > Status: required because the public skills.sh index still exposes stale Skill Graph source rows after the canonical export repository was corrected and pushed.
4
+ >
5
+ > Last verified: 2026-05-14.
6
+
7
+ ## Desired Canonical Source
8
+
9
+ - Public skills.sh URL: https://www.skills.sh/jacob-balslev/skills/
10
+ - GitHub repository: https://github.com/jacob-balslev/skills
11
+ - Branch: `main`
12
+ - Verified commit: `0f0f68e3083ddd049f69eecd16b22106bb5e951c`
13
+ - Repository shape: `skills/<slug>/SKILL.md` at repo root
14
+ - Public CLI proof: `npx.cmd --yes skills add jacob-balslev/skills --list` finds 102 skills
15
+
16
+ ## Stale Source Rows To Merge Or Remove
17
+
18
+ These public rows should no longer be user-facing source paths for Skill Graph skills:
19
+
20
+ | Stale skills.sh source | Live indexed count | Cause |
21
+ |---|---:|---|
22
+ | https://www.skills.sh/jacob-balslev/skill-graph/ | 39 | Old canonical repo was indexed directly before the dedicated export repo existed. |
23
+ | https://www.skills.sh/jacob-balslev/skill-graph-skills/ | 34 | Old split export source; duplicates a subset of the old Skill Graph rows. |
24
+ | https://www.skills.sh/jacob-balslev/skill-graph-skills-missing-1/ | 27 | Old split export source for rows missing from the first split export. |
25
+
26
+ The owner page still reports `3 sources`, `100 skills`, and `420 total installs` at:
27
+
28
+ ```text
29
+ https://www.skills.sh/jacob-balslev/
30
+ ```
31
+
32
+ The owner page should instead expose one public user-facing source:
33
+
34
+ ```text
35
+ jacob-balslev/skills
36
+ ```
37
+
38
+ ## Current Failure Evidence
39
+
40
+ The canonical target exists but is not indexed:
41
+
42
+ ```text
43
+ https://www.skills.sh/jacob-balslev/skills/
44
+ ```
45
+
46
+ Live page metadata still reports `0` skills for `jacob-balslev/skills`.
47
+
48
+ The skills.sh snapshot API confirms the target snapshot is missing:
49
+
50
+ ```text
51
+ https://skills.sh/api/download/jacob-balslev/skills/a11y
52
+ {"error":"not_found"}
53
+ ```
54
+
55
+ The same API confirms the old stale source still has cached snapshot data:
56
+
57
+ ```text
58
+ https://skills.sh/api/download/jacob-balslev/skill-graph/a11y
59
+ ```
60
+
61
+ That old response returns a cached v3 `a11y` `SKILL.md`, proving skills.sh still serves stale rows under the old source.
62
+
63
+ ## User-Side Attempts Already Ruled Out
64
+
65
+ - Direct add/remove telemetry did not transfer old rows to `jacob-balslev/skills`.
66
+ - Temporary-home CLI install/remove attempts did not transfer old rows to `jacob-balslev/skills`.
67
+ - Public CLI discovery against the canonical target works, so the GitHub repo shape is not the blocker.
68
+ - The public CLI source keys telemetry and snapshot download paths by exact `owner/repo`; remove telemetry is not a source-row delete.
69
+ - The public CLI source aliases do not contain any `jacob-balslev/*` alias mapping.
70
+ - The documented skills.sh public surface describes discovery through `npx skills add <owner/repo>` and read APIs, not a user-facing source merge/delete/reindex operation.
71
+ - A related Vercel Community thread states that obsolete skills.sh source lists currently require a skills team fix rather than a self-service rescan or update mechanism: https://community.vercel.com/t/how-to-remove-or-update-obsolete-skill-lists-on-skills-sh/37935
72
+
73
+ ## Requested Maintainer Action
74
+
75
+ Please perform a maintainer-side cleanup or reindex so that:
76
+
77
+ 1. `jacob-balslev/skill-graph`, `jacob-balslev/skill-graph-skills`, and `jacob-balslev/skill-graph-skills-missing-1` are removed, merged, or aliased away from public user-facing source lists.
78
+ 2. `jacob-balslev/skills` becomes the only public user-facing source under `https://www.skills.sh/jacob-balslev/`.
79
+ 3. Snapshot/download rows are generated for the 102 skills in `jacob-balslev/skills@main`.
80
+ 4. `https://www.skills.sh/jacob-balslev/skills/` reports 102 indexed skills.