bmad-module-skill-forge 2.1.0 → 3.0.0

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 (435) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.md +51 -49
  3. package/docs/404.md +10 -8
  4. package/docs/_data/pinned.yaml +22 -13
  5. package/docs/_internal/STABILITY.md +58 -35
  6. package/docs/agents.md +39 -53
  7. package/docs/architecture.md +65 -51
  8. package/docs/bmad-synergy.md +53 -51
  9. package/docs/campaign.md +127 -75
  10. package/docs/concepts.md +34 -28
  11. package/docs/examples.md +70 -68
  12. package/docs/forge-auto.md +34 -31
  13. package/docs/getting-started.md +118 -57
  14. package/docs/how-it-works.md +25 -21
  15. package/docs/index.md +15 -15
  16. package/docs/skill-model.md +70 -59
  17. package/docs/troubleshooting.md +135 -18
  18. package/docs/verifying-a-skill.md +83 -57
  19. package/docs/why-skf.md +24 -22
  20. package/docs/workflows.md +274 -110
  21. package/package.json +18 -10
  22. package/src/forger/preferences.yaml +8 -1
  23. package/src/knowledge/agentskills-spec.md +2 -0
  24. package/src/knowledge/ccc-bridge.md +40 -24
  25. package/src/knowledge/confidence-tiers.md +9 -5
  26. package/src/knowledge/overview.md +3 -3
  27. package/src/knowledge/progressive-capability.md +8 -8
  28. package/src/knowledge/provenance-tracking.md +9 -5
  29. package/src/knowledge/qmd-registry.md +2 -2
  30. package/src/knowledge/skf-knowledge-index.csv +2 -2
  31. package/src/knowledge/skill-lifecycle.md +18 -11
  32. package/src/knowledge/split-body-strategy.md +0 -3
  33. package/src/knowledge/tool-resolution.md +4 -2
  34. package/src/knowledge/version-paths.md +101 -15
  35. package/src/module-help.csv +3 -3
  36. package/src/module.yaml +10 -0
  37. package/src/shared/data/ast-grep-recipes.yaml +608 -0
  38. package/src/shared/data/ide-context-files.json +30 -0
  39. package/src/shared/health-check.md +32 -12
  40. package/src/shared/references/description-guard-protocol.md +14 -9
  41. package/src/shared/references/feasibility-report-schema.md +19 -13
  42. package/src/shared/references/headless-gate-convention.md +55 -3
  43. package/src/shared/references/output-contract-schema.md +19 -8
  44. package/src/shared/references/pipeline-contracts.md +94 -29
  45. package/src/shared/references/tessl-review.md +77 -0
  46. package/src/shared/scripts/schemas/skf-analyze-result-envelope.v1.json +194 -0
  47. package/src/shared/scripts/schemas/skf-audit-result-envelope.v1.json +192 -0
  48. package/src/shared/scripts/schemas/skf-brief-result-envelope.v1.json +32 -4
  49. package/src/shared/scripts/schemas/skf-campaign-result-envelope.v1.json +174 -0
  50. package/src/shared/scripts/schemas/skf-create-skill-result-envelope.v1.json +284 -0
  51. package/src/shared/scripts/schemas/skf-drop-skill-result-envelope.v1.json +164 -0
  52. package/src/shared/scripts/schemas/skf-export-result-envelope.v1.json +160 -0
  53. package/src/shared/scripts/schemas/skf-quick-skill-result-envelope.v1.json +261 -0
  54. package/src/shared/scripts/schemas/skf-refine-architecture-result-envelope.v1.json +192 -0
  55. package/src/shared/scripts/schemas/skf-rename-skill-result-envelope.v1.json +179 -0
  56. package/src/shared/scripts/schemas/skf-setup-result-envelope.v1.json +27 -11
  57. package/src/shared/scripts/schemas/skf-stack-result-envelope.v1.json +176 -0
  58. package/src/shared/scripts/schemas/skf-test-result-envelope.v1.json +173 -0
  59. package/src/shared/scripts/schemas/skf-update-result-envelope.v1.json +19 -5
  60. package/src/shared/scripts/schemas/skf-verify-stack-result-envelope.v1.json +180 -0
  61. package/src/shared/scripts/schemas/skill-brief.v1.json +34 -0
  62. package/src/shared/scripts/schemas/workspace-detection.v1.json +1 -1
  63. package/src/shared/scripts/skf-atomic-write.py +30 -14
  64. package/src/shared/scripts/skf-build-change-manifest.py +2203 -24
  65. package/src/shared/scripts/skf-ccc-git-hygiene.py +532 -0
  66. package/src/shared/scripts/skf-check-unit-records.py +184 -0
  67. package/src/shared/scripts/skf-check-workspace-drift.py +538 -9
  68. package/src/shared/scripts/skf-classify-changed-files.py +694 -0
  69. package/src/shared/scripts/skf-comention-pairs.py +1333 -123
  70. package/src/shared/scripts/skf-compare-file-hashes.py +1 -1
  71. package/src/shared/scripts/skf-count-imports.py +1867 -0
  72. package/src/shared/scripts/skf-count-tokens.py +1 -1
  73. package/src/shared/scripts/skf-derive-assembly-shape.py +3 -2
  74. package/src/shared/scripts/skf-description-guard.py +117 -9
  75. package/src/shared/scripts/skf-detect-docs.py +892 -4
  76. package/src/shared/scripts/skf-detect-language.py +486 -107
  77. package/src/shared/scripts/skf-detect-registry.py +887 -0
  78. package/src/shared/scripts/skf-detect-scripts-assets.py +1 -1
  79. package/src/shared/scripts/skf-detect-tools.py +215 -27
  80. package/src/shared/scripts/skf-detect-workspaces.py +506 -30
  81. package/src/shared/scripts/skf-disqualify-candidates.py +821 -182
  82. package/src/shared/scripts/skf-emit-brief-result-envelope.py +69 -191
  83. package/src/shared/scripts/skf-emit-result-envelope.py +1604 -106
  84. package/src/shared/scripts/skf-enumerate-stack-skills.py +986 -117
  85. package/src/shared/scripts/skf-extract-public-api.py +4084 -85
  86. package/src/shared/scripts/skf-extraction-inventory.py +746 -0
  87. package/src/shared/scripts/skf-extraction-snapshot.py +539 -0
  88. package/src/shared/scripts/skf-fetch-temporal.py +674 -0
  89. package/src/shared/scripts/skf-find-cycles.py +97 -29
  90. package/src/shared/scripts/skf-find-test-report.py +476 -0
  91. package/src/shared/scripts/skf-forge-tier-rw.py +444 -203
  92. package/src/shared/scripts/skf-github-fetch.py +365 -0
  93. package/src/shared/scripts/skf-github-probe.py +661 -0
  94. package/src/shared/scripts/skf-hash-content.py +166 -12
  95. package/src/shared/scripts/skf-language-corpora.py +1 -1
  96. package/src/shared/scripts/skf-load-provenance.py +159 -27
  97. package/src/shared/scripts/skf-manifest-ops.py +1 -1
  98. package/src/shared/scripts/skf-merge-ccc-exclusions.py +2307 -223
  99. package/src/shared/scripts/skf-merge-doc-urls.py +1 -1
  100. package/src/shared/scripts/skf-names-present.py +221 -0
  101. package/src/shared/scripts/skf-pair-intersect.py +119 -28
  102. package/src/shared/scripts/skf-parse-gaps.py +1384 -0
  103. package/src/shared/scripts/skf-preapply.py +1 -1
  104. package/src/shared/scripts/skf-preflight.py +161 -27
  105. package/src/shared/scripts/skf-promote-staged.py +430 -0
  106. package/src/shared/scripts/skf-provenance-gap-dispatch.py +39 -7
  107. package/src/shared/scripts/skf-qmd-classify-collections.py +229 -45
  108. package/src/shared/scripts/skf-quick-batch.py +774 -0
  109. package/src/shared/scripts/skf-rebuild-managed-sections.py +972 -88
  110. package/src/shared/scripts/skf-recommend-scope-type.py +323 -156
  111. package/src/shared/scripts/skf-render-metadata-stats.py +156 -12
  112. package/src/shared/scripts/skf-render-quick-metadata.py +132 -28
  113. package/src/shared/scripts/skf-render-stack-metadata.py +976 -0
  114. package/src/shared/scripts/skf-resolve-authoritative-files.py +128 -13
  115. package/src/shared/scripts/skf-resolve-package.py +523 -106
  116. package/src/shared/scripts/skf-rewrite-skill-name.py +433 -47
  117. package/src/shared/scripts/skf-run-lock.py +577 -0
  118. package/src/shared/scripts/skf-scan-manifests.py +998 -57
  119. package/src/shared/scripts/skf-scan-skill-md-structure.py +1341 -37
  120. package/src/shared/scripts/skf-severity-classify.py +712 -108
  121. package/src/shared/scripts/skf-shape-detect.py +298 -204
  122. package/src/shared/scripts/skf-shard-body.py +9 -8
  123. package/src/shared/scripts/skf-skill-inventory.py +2412 -89
  124. package/src/shared/scripts/skf-skills-module.py +472 -0
  125. package/src/shared/scripts/skf-source-tree.py +1796 -0
  126. package/src/shared/scripts/skf-structural-diff.py +670 -119
  127. package/src/shared/scripts/skf-tessl-review.py +706 -0
  128. package/src/shared/scripts/skf-update-active-symlink.py +5 -5
  129. package/src/shared/scripts/skf-update-run-state.py +624 -0
  130. package/src/shared/scripts/skf-validate-brief-inputs.py +92 -29
  131. package/src/shared/scripts/skf-validate-brief-schema.py +4 -1
  132. package/src/shared/scripts/skf-validate-feasibility-report.py +577 -66
  133. package/src/shared/scripts/skf-validate-frontmatter.py +103 -26
  134. package/src/shared/scripts/skf-validate-output.py +712 -64
  135. package/src/shared/scripts/skf-validate-pins.py +1 -1
  136. package/src/shared/scripts/skf-verify-no-trace.py +116 -10
  137. package/src/shared/scripts/skf-verify-provenance-completeness.py +2919 -54
  138. package/src/shared/scripts/skf-write-skill-brief.py +367 -19
  139. package/src/shared/tool-requirements.yaml +201 -0
  140. package/src/skf-analyze-source/SKILL.md +41 -36
  141. package/src/skf-analyze-source/assets/skill-brief-schema.md +7 -8
  142. package/src/skf-analyze-source/customize.toml +36 -24
  143. package/src/skf-analyze-source/references/auto-docs-only.md +58 -20
  144. package/src/skf-analyze-source/references/continue.md +2 -13
  145. package/src/skf-analyze-source/references/discover-additional-source.md +147 -0
  146. package/src/skf-analyze-source/references/generate-briefs.md +121 -55
  147. package/src/skf-analyze-source/references/headless-contract.md +42 -15
  148. package/src/skf-analyze-source/references/identify-units.md +96 -110
  149. package/src/skf-analyze-source/references/init.md +73 -71
  150. package/src/skf-analyze-source/references/map-and-detect.md +123 -105
  151. package/src/skf-analyze-source/references/map-unit-exports.md +68 -0
  152. package/src/skf-analyze-source/references/recommend.md +51 -70
  153. package/src/skf-analyze-source/references/scan-project.md +60 -84
  154. package/src/skf-analyze-source/references/scan-root.md +39 -0
  155. package/src/skf-analyze-source/references/step-auto-scope-coexistence.md +47 -0
  156. package/src/skf-analyze-source/references/step-auto-scope-corpora.md +53 -0
  157. package/src/skf-analyze-source/references/step-auto-scope-split.md +91 -0
  158. package/src/skf-analyze-source/references/step-auto-scope.md +208 -293
  159. package/src/skf-analyze-source/references/step-shape-detect.md +14 -12
  160. package/src/skf-analyze-source/references/unit-detection-heuristics.md +37 -42
  161. package/src/skf-audit-skill/SKILL.md +43 -51
  162. package/src/skf-audit-skill/assets/drift-report-template.md +27 -3
  163. package/src/skf-audit-skill/customize.toml +41 -20
  164. package/src/skf-audit-skill/references/constituent-freshness.md +91 -0
  165. package/src/skf-audit-skill/references/doc-drift.md +141 -0
  166. package/src/skf-audit-skill/references/headless-contract.md +29 -0
  167. package/src/skf-audit-skill/references/init.md +148 -210
  168. package/src/skf-audit-skill/references/re-index.md +96 -108
  169. package/src/skf-audit-skill/references/report.md +96 -33
  170. package/src/skf-audit-skill/references/semantic-diff.md +27 -18
  171. package/src/skf-audit-skill/references/severity-classify.md +79 -65
  172. package/src/skf-audit-skill/references/severity-rules.md +15 -6
  173. package/src/skf-audit-skill/references/structural-diff.md +75 -90
  174. package/src/skf-audit-skill/references/upstream-checkout.md +77 -0
  175. package/src/skf-audit-skill/scripts/render-drift-tables.py +685 -0
  176. package/src/skf-brief-skill/SKILL.md +36 -25
  177. package/src/skf-brief-skill/assets/description-voice-examples.md +1 -1
  178. package/src/skf-brief-skill/assets/scope-templates.md +17 -24
  179. package/src/skf-brief-skill/assets/skill-brief-schema.md +29 -15
  180. package/src/skf-brief-skill/customize.toml +48 -20
  181. package/src/skf-brief-skill/references/analyze-target.md +142 -125
  182. package/src/skf-brief-skill/references/confirm-brief.md +10 -8
  183. package/src/skf-brief-skill/references/draft-checkpoint.md +36 -17
  184. package/src/skf-brief-skill/references/gather-intent-ratify.md +68 -0
  185. package/src/skf-brief-skill/references/gather-intent.md +87 -182
  186. package/src/skf-brief-skill/references/headless-args.md +84 -16
  187. package/src/skf-brief-skill/references/health-check.md +1 -1
  188. package/src/skf-brief-skill/references/invocation-contract.md +18 -13
  189. package/src/skf-brief-skill/references/portfolio-similarity-check.md +1 -1
  190. package/src/skf-brief-skill/references/qmd-collection-registration.md +7 -10
  191. package/src/skf-brief-skill/references/scope-definition.md +123 -47
  192. package/src/skf-brief-skill/references/step-auto-brief.md +24 -80
  193. package/src/skf-brief-skill/references/step-auto-validate.md +20 -121
  194. package/src/skf-brief-skill/references/version-resolution.md +3 -2
  195. package/src/skf-brief-skill/references/write-brief.md +66 -57
  196. package/src/skf-campaign/SKILL.md +31 -34
  197. package/src/skf-campaign/assets/campaign-state-schema.json +25 -4
  198. package/src/skf-campaign/customize.toml +47 -16
  199. package/src/skf-campaign/references/campaign-contracts.md +39 -29
  200. package/src/skf-campaign/references/campaign-directive-spec.md +4 -2
  201. package/src/skf-campaign/references/health-check.md +7 -16
  202. package/src/skf-campaign/references/step-01-setup.md +46 -84
  203. package/src/skf-campaign/references/step-02-strategy.md +31 -30
  204. package/src/skf-campaign/references/step-03-pins.md +26 -18
  205. package/src/skf-campaign/references/step-04-provenance.md +24 -23
  206. package/src/skf-campaign/references/step-05-skill-loop.md +67 -48
  207. package/src/skf-campaign/references/step-06-batch.md +41 -34
  208. package/src/skf-campaign/references/step-07-capstone.md +40 -25
  209. package/src/skf-campaign/references/step-08-verify.md +28 -29
  210. package/src/skf-campaign/references/step-09-refine.md +29 -30
  211. package/src/skf-campaign/references/step-10-export.md +48 -36
  212. package/src/skf-campaign/references/step-11-maintenance.md +31 -34
  213. package/src/skf-campaign/references/step-resume.md +37 -68
  214. package/src/skf-campaign/scripts/campaign-deps.py +57 -18
  215. package/src/skf-campaign/scripts/campaign-parse-manifest.py +361 -54
  216. package/src/skf-campaign/scripts/campaign-provenance.py +96 -53
  217. package/src/skf-campaign/scripts/campaign-quality-gate.py +592 -0
  218. package/src/skf-campaign/scripts/campaign-render-batch.py +257 -49
  219. package/src/skf-campaign/scripts/campaign-render-kickoff.py +343 -50
  220. package/src/skf-campaign/scripts/campaign-report.py +204 -37
  221. package/src/skf-campaign/scripts/campaign-state.py +1128 -0
  222. package/src/skf-campaign/scripts/campaign-status.py +10 -74
  223. package/src/skf-campaign/scripts/campaign-validate-pins.py +30 -3
  224. package/src/skf-campaign/scripts/campaign-validate-state.py +34 -4
  225. package/src/skf-campaign/templates/campaign-brief-template.yaml +4 -5
  226. package/src/skf-campaign/templates/campaign-report-template.md +5 -1
  227. package/src/skf-campaign/templates/kickoff-template.md +0 -14
  228. package/src/skf-create-skill/SKILL.md +27 -20
  229. package/src/skf-create-skill/assets/compile-assembly-rules.md +6 -5
  230. package/src/skf-create-skill/assets/skill-sections.md +17 -6
  231. package/src/skf-create-skill/customize.toml +20 -8
  232. package/src/skf-create-skill/references/authoritative-files-protocol.md +41 -42
  233. package/src/skf-create-skill/references/batch-mode.md +81 -0
  234. package/src/skf-create-skill/references/ccc-index-check.md +27 -0
  235. package/src/skf-create-skill/references/compile.md +107 -29
  236. package/src/skf-create-skill/references/component-extraction.md +113 -91
  237. package/src/skf-create-skill/references/enrich.md +41 -23
  238. package/src/skf-create-skill/references/entry-points-by-hand.md +20 -0
  239. package/src/skf-create-skill/references/extract.md +200 -161
  240. package/src/skf-create-skill/references/extraction-patterns-by-hand.md +141 -0
  241. package/src/skf-create-skill/references/extraction-patterns-tracing.md +2 -2
  242. package/src/skf-create-skill/references/extraction-patterns.md +584 -196
  243. package/src/skf-create-skill/references/generate-artifacts.md +145 -93
  244. package/src/skf-create-skill/references/health-check.md +1 -1
  245. package/src/skf-create-skill/references/load-brief.md +53 -36
  246. package/src/skf-create-skill/references/relabel-rule.md +12 -0
  247. package/src/skf-create-skill/references/report.md +28 -59
  248. package/src/skf-create-skill/references/source-resolution-protocols.md +49 -155
  249. package/src/skf-create-skill/references/step-auto-shard.md +20 -93
  250. package/src/skf-create-skill/references/step-doc-rot.md +44 -60
  251. package/src/skf-create-skill/references/step-doc-sources.md +55 -18
  252. package/src/skf-create-skill/references/sub/ccc-discover.md +18 -7
  253. package/src/skf-create-skill/references/sub/fetch-docs.md +106 -57
  254. package/src/skf-create-skill/references/sub/fetch-temporal.md +53 -166
  255. package/src/skf-create-skill/references/tier-degradation-rules.md +18 -9
  256. package/src/skf-create-skill/references/validate.md +173 -99
  257. package/src/skf-create-skill/scripts/scan-doc-rot.py +232 -99
  258. package/src/skf-create-stack-skill/SKILL.md +29 -56
  259. package/src/skf-create-stack-skill/assets/metadata-contract.md +51 -0
  260. package/src/skf-create-stack-skill/assets/provenance-map-schema.md +15 -15
  261. package/src/skf-create-stack-skill/assets/stack-skill-template.md +23 -57
  262. package/src/skf-create-stack-skill/customize.toml +23 -12
  263. package/src/skf-create-stack-skill/references/compile-stack.md +57 -66
  264. package/src/skf-create-stack-skill/references/compose-mode-rules.md +24 -44
  265. package/src/skf-create-stack-skill/references/detect-integrations.md +92 -95
  266. package/src/skf-create-stack-skill/references/detect-manifests.md +46 -71
  267. package/src/skf-create-stack-skill/references/generate-output.md +138 -128
  268. package/src/skf-create-stack-skill/references/init.md +90 -32
  269. package/src/skf-create-stack-skill/references/integration-patterns.md +1 -17
  270. package/src/skf-create-stack-skill/references/invocation-contract.md +34 -0
  271. package/src/skf-create-stack-skill/references/manifest-patterns.md +32 -20
  272. package/src/skf-create-stack-skill/references/parallel-extract.md +112 -38
  273. package/src/skf-create-stack-skill/references/rank-and-confirm.md +57 -75
  274. package/src/skf-create-stack-skill/references/report.md +39 -33
  275. package/src/skf-create-stack-skill/references/validate.md +20 -39
  276. package/src/skf-drop-skill/SKILL.md +28 -51
  277. package/src/skf-drop-skill/customize.toml +44 -30
  278. package/src/skf-drop-skill/references/execute.md +79 -146
  279. package/src/skf-drop-skill/references/invocation-contract.md +64 -0
  280. package/src/skf-drop-skill/references/report.md +46 -30
  281. package/src/skf-drop-skill/references/select.md +118 -124
  282. package/src/skf-drop-skill/scripts/dir-sizes.py +54 -26
  283. package/src/skf-drop-skill/scripts/drop-roster.py +322 -0
  284. package/src/skf-export-skill/SKILL.md +40 -62
  285. package/src/skf-export-skill/assets/managed-section-format.md +14 -50
  286. package/src/skf-export-skill/assets/snippet-format.md +3 -1
  287. package/src/skf-export-skill/customize.toml +42 -13
  288. package/src/skf-export-skill/references/generate-snippet.md +54 -46
  289. package/src/skf-export-skill/references/health-check.md +2 -0
  290. package/src/skf-export-skill/references/invocation-contract.md +15 -0
  291. package/src/skf-export-skill/references/load-skill.md +88 -62
  292. package/src/skf-export-skill/references/manifest-rebuild.md +9 -10
  293. package/src/skf-export-skill/references/multi-skill-mode.md +4 -4
  294. package/src/skf-export-skill/references/orphan-context-detection.md +13 -5
  295. package/src/skf-export-skill/references/orphan-row-detection.md +31 -22
  296. package/src/skf-export-skill/references/package.md +15 -73
  297. package/src/skf-export-skill/references/preflight-snippet-root-probe.md +51 -70
  298. package/src/skf-export-skill/references/result-envelope.md +31 -16
  299. package/src/skf-export-skill/references/summary.md +41 -17
  300. package/src/skf-export-skill/references/token-report.md +4 -12
  301. package/src/skf-export-skill/references/update-context.md +118 -237
  302. package/src/skf-forger/SKILL.md +61 -37
  303. package/src/skf-forger/bmad-skill-manifest.yaml +4 -1
  304. package/src/skf-forger/customize.toml +43 -0
  305. package/src/skf-forger/references/pipeline-mode.md +73 -18
  306. package/src/skf-forger/scripts/forge-status.py +299 -0
  307. package/src/skf-forger/scripts/parse-pipeline.py +322 -54
  308. package/src/skf-forger/scripts/pipeline-gate.py +428 -0
  309. package/src/skf-forger/scripts/pipeline-journal.py +1052 -0
  310. package/src/skf-quick-skill/SKILL.md +54 -53
  311. package/src/skf-quick-skill/assets/skill-template.md +4 -2
  312. package/src/skf-quick-skill/customize.toml +51 -20
  313. package/src/skf-quick-skill/references/batch-mode.md +74 -21
  314. package/src/skf-quick-skill/references/compile.md +30 -31
  315. package/src/skf-quick-skill/references/ecosystem-check.md +7 -57
  316. package/src/skf-quick-skill/references/finalize.md +69 -18
  317. package/src/skf-quick-skill/references/halt-contract.md +41 -29
  318. package/src/skf-quick-skill/references/health-check.md +5 -3
  319. package/src/skf-quick-skill/references/quick-extract.md +114 -45
  320. package/src/skf-quick-skill/references/registry-resolution.md +9 -64
  321. package/src/skf-quick-skill/references/resolve-target.md +116 -66
  322. package/src/skf-quick-skill/references/write-and-validate.md +79 -40
  323. package/src/skf-refine-architecture/SKILL.md +43 -53
  324. package/src/skf-refine-architecture/customize.toml +49 -20
  325. package/src/skf-refine-architecture/references/compile.md +97 -54
  326. package/src/skf-refine-architecture/references/exit-codes.md +30 -0
  327. package/src/skf-refine-architecture/references/finding-storage.md +21 -0
  328. package/src/skf-refine-architecture/references/gap-analysis.md +101 -38
  329. package/src/skf-refine-architecture/references/improvements.md +14 -20
  330. package/src/skf-refine-architecture/references/init.md +98 -57
  331. package/src/skf-refine-architecture/references/issue-detection.md +32 -39
  332. package/src/skf-refine-architecture/references/refinement-rules.md +37 -48
  333. package/src/skf-refine-architecture/references/report.md +65 -54
  334. package/src/skf-refine-architecture/scripts/skf-check-preservation.py +1619 -0
  335. package/src/skf-rename-skill/SKILL.md +19 -54
  336. package/src/skf-rename-skill/customize.toml +32 -26
  337. package/src/skf-rename-skill/references/execute.md +230 -184
  338. package/src/skf-rename-skill/references/exit-codes.md +7 -7
  339. package/src/skf-rename-skill/references/health-check.md +1 -7
  340. package/src/skf-rename-skill/references/invocation-contract.md +25 -0
  341. package/src/skf-rename-skill/references/report.md +63 -52
  342. package/src/skf-rename-skill/references/select.md +197 -115
  343. package/src/skf-rename-skill/scripts/skf-validate-rename-name.py +161 -21
  344. package/src/skf-setup/SKILL.md +26 -26
  345. package/src/skf-setup/customize.toml +14 -10
  346. package/src/skf-setup/references/auto-index.md +50 -63
  347. package/src/skf-setup/references/ccc-index.md +29 -89
  348. package/src/skf-setup/references/detect-and-tier.md +58 -66
  349. package/src/skf-setup/references/health-check.md +2 -0
  350. package/src/skf-setup/references/invocation-contract.md +14 -0
  351. package/src/skf-setup/references/report.md +43 -166
  352. package/src/skf-setup/references/tier-rules.md +5 -5
  353. package/src/skf-setup/references/write-config.md +34 -57
  354. package/src/skf-test-skill/SKILL.md +17 -57
  355. package/src/skf-test-skill/assets/output-section-formats.md +33 -34
  356. package/src/skf-test-skill/customize.toml +27 -13
  357. package/src/skf-test-skill/references/coherence-check.md +134 -62
  358. package/src/skf-test-skill/references/coverage-check-tiers.md +35 -0
  359. package/src/skf-test-skill/references/coverage-check.md +217 -254
  360. package/src/skf-test-skill/references/detect-mode.md +5 -5
  361. package/src/skf-test-skill/references/external-validators.md +94 -82
  362. package/src/skf-test-skill/references/health-check.md +6 -7
  363. package/src/skf-test-skill/references/init.md +163 -88
  364. package/src/skf-test-skill/references/invocation-contract.md +66 -0
  365. package/src/skf-test-skill/references/migration-section-rules.md +5 -2
  366. package/src/skf-test-skill/references/report.md +162 -142
  367. package/src/skf-test-skill/references/score.md +80 -107
  368. package/src/skf-test-skill/references/scoring-rules.md +41 -155
  369. package/src/skf-test-skill/references/source-access-protocol.md +19 -92
  370. package/src/skf-test-skill/references/step-hard-gate.md +51 -33
  371. package/src/skf-test-skill/scripts/aggregate-coherence.py +218 -30
  372. package/src/skf-test-skill/scripts/build-result-context.py +287 -0
  373. package/src/skf-test-skill/scripts/check-metadata-coherence.py +37 -4
  374. package/src/skf-test-skill/scripts/combine-external-scores.py +23 -6
  375. package/src/skf-test-skill/scripts/compute-score.py +223 -45
  376. package/src/skf-test-skill/scripts/gap-ledger.py +1381 -0
  377. package/src/skf-test-skill/scripts/hard-gate.py +203 -0
  378. package/src/skf-test-skill/scripts/load-coverage-inputs.py +760 -0
  379. package/src/skf-test-skill/scripts/locate-export-segments.py +835 -0
  380. package/src/skf-test-skill/scripts/reconcile-coverage.py +273 -79
  381. package/src/skf-test-skill/scripts/score-signatures.py +459 -0
  382. package/src/skf-test-skill/scripts/stage-helper-payload.py +148 -0
  383. package/src/skf-test-skill/scripts/validate-inventory.py +311 -16
  384. package/src/skf-test-skill/scripts/verify-declared-numerator.py +127 -52
  385. package/src/skf-test-skill/templates/test-report-template.md +21 -15
  386. package/src/skf-update-skill/SKILL.md +38 -25
  387. package/src/skf-update-skill/customize.toml +27 -12
  388. package/src/skf-update-skill/references/detect-changes.md +233 -222
  389. package/src/skf-update-skill/references/gap-driven.md +336 -0
  390. package/src/skf-update-skill/references/health-check.md +31 -5
  391. package/src/skf-update-skill/references/init.md +250 -84
  392. package/src/skf-update-skill/references/invocation-contract.md +12 -0
  393. package/src/skf-update-skill/references/manual-section-rules.md +6 -23
  394. package/src/skf-update-skill/references/merge.md +180 -47
  395. package/src/skf-update-skill/references/re-extract.md +53 -262
  396. package/src/skf-update-skill/references/report.md +100 -35
  397. package/src/skf-update-skill/references/write.md +331 -149
  398. package/src/skf-update-skill/scripts/skf-new-file-diff.py +29 -7
  399. package/src/skf-verify-stack/SKILL.md +23 -42
  400. package/src/skf-verify-stack/assets/feasibility-report-template.md +11 -5
  401. package/src/skf-verify-stack/customize.toml +55 -22
  402. package/src/skf-verify-stack/references/coverage-patterns.md +17 -8
  403. package/src/skf-verify-stack/references/coverage.md +67 -64
  404. package/src/skf-verify-stack/references/exit-codes.md +21 -8
  405. package/src/skf-verify-stack/references/init.md +107 -62
  406. package/src/skf-verify-stack/references/integration-verification-rules.md +12 -13
  407. package/src/skf-verify-stack/references/integrations.md +106 -65
  408. package/src/skf-verify-stack/references/report.md +59 -42
  409. package/src/skf-verify-stack/references/requirements.md +32 -9
  410. package/src/skf-verify-stack/references/synthesize.md +53 -39
  411. package/src/skf-verify-stack/scripts/skf-coverage-tally.py +398 -52
  412. package/src/skf-verify-stack/scripts/skf-previous-report.py +330 -0
  413. package/src/skf-verify-stack/scripts/skf-report-delta.py +453 -49
  414. package/src/skf-verify-stack/scripts/skf-verdict-rollup.py +240 -27
  415. package/tools/cli/commands/install.js +11 -4
  416. package/tools/cli/commands/status.js +15 -3
  417. package/tools/cli/commands/update.js +11 -4
  418. package/tools/cli/lib/tool-check.js +320 -0
  419. package/tools/cli/lib/version-check.js +22 -9
  420. package/tools/cli/skf-cli.js +4 -1
  421. package/.gitattributes +0 -16
  422. package/.nvmrc +0 -1
  423. package/docs/_internal/RELEASING.md +0 -645
  424. package/release-audits/v1.0.0-launch-audit.md +0 -728
  425. package/src/skf-audit-skill/references/step-doc-drift.md +0 -177
  426. package/src/skf-brief-skill/references/headless-source-authority-detection.md +0 -26
  427. package/src/skf-campaign/manifest.yaml +0 -15
  428. package/src/skf-create-skill/assets/tessl-dismissal-rules.md +0 -106
  429. package/src/skf-create-skill/references/ecosystem-check.md +0 -74
  430. package/src/skf-drop-skill/references/headless-contract.md +0 -18
  431. package/src/skf-update-skill/references/merge-conflict-rules.md +0 -15
  432. package/src/skf-update-skill/references/remote-source-resolution.md +0 -98
  433. package/src/skf-update-skill/references/validate.md +0 -124
  434. package/tools/validate-docs-drift.js +0 -233
  435. package/tools/validate-docs-links.js +0 -665
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Skill Model
3
- description: What a Skill Forge skill contains — progressive capability tiers, confidence model, output architecture, the dual-output strategy, and the ownership model.
3
+ description: What a Skill Forge skill contains, from progressive capability tiers and the confidence model to output architecture, the dual-output strategy and the ownership model.
4
4
  ---
5
5
 
6
6
  A Skill Forge skill is more than a single markdown file. This page explains what ships when you compile and export a skill: the capability tier your forge runs at, the confidence level of every claim, the files in the output directory, and why every skill is shipped as both an active instruction manual and a passive context index. For a walkthrough of compilation, see [How It Works](/docs/how-it-works.md). For the audit recipe that ties this all together, see [Verifying a Skill](/docs/verifying-a-skill.md).
@@ -13,10 +13,10 @@ SKF uses an additive tier model. You never lose capability by adding a tool.
13
13
 
14
14
  | Tier | Required Tools | What You Get |
15
15
  |------|---------------|-------------|
16
- | **Quick** | None (`gh_bridge`, `skill-check`, `tessl` used when available) | Source reading + spec validation + content quality review. Best-effort skills in under a minute. **Note:** Quick Skill (QS) is tier-unaware by design — it always runs at community tier regardless of installed tools. |
17
- | **Forge** | + `ast_bridge` (ast-grep) | Structural truth. AST-verified signatures. Co-import detection. T1 confidence. |
18
- | **Forge+** | + `ccc_bridge` (cocoindex-code) | Semantic discovery. CCC pre-ranks files by meaning before AST extraction. Better coverage on large codebases. |
19
- | **Deep** | `ast_bridge` + `gh_bridge` (gh) + `qmd_bridge` (QMD). CCC optional — enhances when installed. | Knowledge search. Temporal provenance. Drift detection. Full intelligence. |
16
+ | **Quick** | None (`gh_bridge` and `skill-check` used when available; `tessl` when you opt in to Tessl Review) | Source reading + spec validation. Best-effort skills in under a minute. **Note:** Quick Skill (QS) ignores your tier on purpose. It always reads source without ast-grep and records `confidence_tier: Quick` and `source_authority: community`, whatever tools you have installed. It never runs Tessl Review. |
17
+ | **Forge** | + `ast_bridge` (ast-grep) | Structural truth. Each export an ast-grep rule matches is AST-verified and labeled T1; one it cannot match is read by eye and labeled T1-low. Co-import detection. |
18
+ | **Forge+** | + `ccc_bridge` (cocoindex-code) | Semantic discovery. CCC ranks files by meaning, so a step that reads files one at a time reads the most relevant first; the ast-grep recipe runner reads every file in scope either way. Helps most on large codebases. |
19
+ | **Deep** | `ast_bridge` + `gh_bridge` (gh) + `qmd_bridge` (QMD). CCC is optional and adds semantic discovery when installed. | Knowledge search. Temporal provenance (issue, PR and changelog history). Audit Skill adds QMD semantic comparison to its drift checks. Full intelligence. |
20
20
 
21
21
  Setup detects your installed tools and sets your tier automatically:
22
22
 
@@ -30,7 +30,7 @@ Setup detects your installed tools and sets your tier automatically:
30
30
  ═══════════════════════════════════════
31
31
 
32
32
  Tier: Deep
33
- Deep tier active. Full capability unlocked — AST-backed code analysis,
33
+ Deep tier active. Full capability unlocked: AST-backed code analysis,
34
34
  GitHub repository exploration, and QMD knowledge search with
35
35
  cross-repository synthesis. Maximum provenance and intelligence.
36
36
 
@@ -45,30 +45,29 @@ Setup detects your installed tools and sets your tier automatically:
45
45
  23 orphaned collection(s) kept
46
46
 
47
47
  CCC Index:
48
- indexed this run — semantic discovery ready (1 file)
48
+ indexed this run, semantic discovery ready (1 file)
49
49
 
50
50
  Files written this run:
51
- - forge-tier.yaml — {project-root}/_bmad/_memory/forger-sidecar/forge-tier.yaml
52
- - .cocoindex_code/settings.yml — {project-root}/.cocoindex_code/settings.yml (6 SKF exclusion patterns merged)
53
- - .cocoindex_code/ ccc index — 1 file indexed
51
+ - forge-tier.yaml: {project-root}/_bmad/_memory/forger-sidecar/forge-tier.yaml
52
+ - {project-root}/forge-data/ (directory ensured)
53
+ - .cocoindex_code/settings.yml: {project-root}/.cocoindex_code/settings.yml (6 SKF exclusion patterns merged)
54
+ - .gitignore: {project-root}/.gitignore (`/.cocoindex_code/` added by `ccc init`)
55
+ - .cocoindex_code/ ccc index: 1 file indexed
54
56
 
55
57
  ═══════════════════════════════════════
56
58
  Forge ready. Deep tier active.
57
59
  ═══════════════════════════════════════
58
60
 
59
- Next: try [BS] Brief Skill to scope your first compilation target,
60
- or [QS] Quick Skill for a fast template-driven path.
61
- Already have a skill? [AS] Audit Skill drift-checks an existing skill
62
- against current sources.
63
-
64
61
  Health Check: Clean run. No workflow issues to report.
65
62
 
66
63
  Workflow complete.
67
64
  ```
68
65
 
69
- Don't have ast-grep, cocoindex-code, or QMD yet? No problem — Quick mode works with no additional tools. Optional GitHub CLI improves source access. Install tools later; your tier upgrades automatically.
66
+ Setup then suggests where to go next: `@Ferris forge-auto <repo-or-doc-url>` briefs, compiles, tests and exports a skill in one command; `/skf-brief-skill` lets you scope a skill by hand; `/skf-quick-skill` is a fast template-driven path; and `/skf-audit-skill` checks a skill you already have against its current source.
67
+
68
+ Don't have ast-grep, cocoindex-code, or QMD yet? That's fine. Quick tier works with no extra tools, and the GitHub CLI (`gh`), if you have it, helps it read remote source. When you install a tool later, run `@Ferris SF` again: setup detects it and raises your tier.
70
69
 
71
- ### Tier Override — Comparing Output Across Tiers
70
+ ### Tier Override: Comparing Output Across Tiers
72
71
 
73
72
  You can force a specific tier by setting `tier_override` in your preferences file (`_bmad/_memory/forger-sidecar/preferences.yaml`):
74
73
 
@@ -77,22 +76,22 @@ You can force a specific tier by setting `tier_override` in your preferences fil
77
76
  tier_override: Forge
78
77
  ```
79
78
 
80
- This is useful for comparing skill quality across tiers for the same target:
79
+ This is useful for comparing skill quality across tiers for the same target. Each recompile writes into the same version folder and replaces the previous run's files, so commit or copy the skill folder before you switch tiers:
81
80
 
82
81
  ```
83
82
  # 1. Set tier_override: Quick in preferences.yaml
84
83
  @Ferris CS # compile at Quick tier
85
84
 
86
85
  # 2. Change to tier_override: Forge
87
- @Ferris CS # recompile at Forge tier — compare output
86
+ @Ferris CS # recompile at Forge tier, then compare output
88
87
 
89
88
  # 3. Change to tier_override: Forge+
90
- @Ferris CS # recompile with semantic discovery — compare coverage
89
+ @Ferris CS # recompile with semantic discovery, then compare coverage
91
90
 
92
91
  # 4. Reset to tier_override: ~ (auto-detect)
93
92
  ```
94
93
 
95
- Set `tier_override` to `Quick`, `Forge`, `Forge+`, or `Deep`. Set to `~` (null) to return to auto-detection. The override is respected by all tier-aware workflows (AN, BS, CS, SS, US, AS, TS).
94
+ Set `tier_override` to `Quick`, `Forge`, `Forge+`, or `Deep` (capital letters matter). Set it to `~` (null) to return to auto-detection. Setup (SF) and every tier-aware workflow respect it: Analyze Source (AN), Brief Skill (BS), Create Skill (CS), Stack Skill (SS), Update Skill (US), Audit Skill (AS) and Test Skill (TS). Quick Skill (QS) ignores it. SKF ignores a value it does not recognize and uses the detected tier. You can force a tier your tools do not support, but setup warns you, and steps that need a missing tool then stop or fall back to a lower tier with a warning.
96
95
 
97
96
  ---
98
97
 
@@ -102,39 +101,43 @@ Every claim in a generated skill carries a confidence tier that traces to its so
102
101
 
103
102
  | Tier | Source | Tool | What It Means |
104
103
  |------|--------|------|---------------|
105
- | **T1** | AST extraction | `ast_bridge` | Current code, structurally verified. Immutable for that version. |
106
- | **T1-low** | Source reading | `ast_bridge` (fallback) | Source-read without AST verification. Produced by Quick tier and by Forge/Forge+/Deep when ast-grep cannot parse a specific file. Location correct, signature may be inferred. |
104
+ | **T1** | AST extraction | `ast_bridge` | An ast-grep rule matched the export in the current code: structurally verified, and immutable for that version. Cited `[AST:file:Lnn]`. |
105
+ | **T1-low** | Source reading | Source reading (no ast-grep) | Read from source without AST verification. Produced by Quick tier, and by Forge, Forge+ and Deep for any export read by eye: when ast-grep cannot parse a file, when a remote source cannot be cloned, or when an export is read directly while ast-grep works. Location correct, signature may be inferred. Cited `[SRC:file:Lnn]`. |
107
106
  | **T2** | QMD evidence | `qmd_bridge` | Historical + planned context (issues, PRs, changelogs, docs). |
108
- | **T3** | External documentation | `doc_fetcher` | External, untrusted. Quarantined. |
107
+ | **T3** | External documentation | `doc_fetcher` | External and untrusted, so SKF keeps it apart: a T3 claim keeps its `[EXT:...]` label and never overrides a T1, T1-low or T2 claim. |
108
+
109
+ **Labels follow the tool that read each export, not the forge tier.** A Deep-tier skill can hold T1-low entries next to its T1 ones, and its provenance map records each entry's `extraction_method` (`ast-grep` or `source-read`) beside its `confidence`. Before SKF 3.0.0 the label followed the forge tier, so a skill built at Forge or above could claim T1 for an export nothing parsed. Expect lower T1 counts, in the skill's citations and in its `metadata.json` `confidence_distribution`, when you build or update a skill now, with nothing less extracted. Audit Skill lists a label that changed this way in its own table, "Provenance label differences (not drift)", and never counts it as drift.
109
110
 
110
111
  ### Temporal Provenance
111
112
 
112
113
  Confidence tiers map to temporal scopes:
113
114
 
114
- - **T1-now (instructions):** What ast-grep sees in the checked-out code. This is what your agent executes.
115
- - **T2-past (annotations):** Closed issues, merged PRs, changelogs — why the API looks the way it does.
116
- - **T2-future (annotations):** Open PRs, deprecation warnings, RFCs — what's coming.
115
+ - **T1-now (instructions):** What the checked-out code holds, read by ast-grep (T1) or by eye (T1-low). This is what your agent executes.
116
+ - **T2-past (annotations):** Closed issues, merged PRs and changelogs that explain why the API looks the way it does.
117
+ - **T2-future (annotations):** Open PRs, deprecation warnings and RFCs that show what's coming.
117
118
 
118
119
  Progressive disclosure controls how much context surfaces at each level:
119
120
 
120
121
  | Output | Content |
121
122
  |--------|---------|
122
- | `context-snippet.md` | T1-now + T2-future gotchas (breaking changes, deprecation warnings) — compressed, always-on |
123
- | `SKILL.md` | T1-now + lightweight T2 annotations |
123
+ | `context-snippet.md` | T1-now + T2-future gotchas (breaking changes, deprecation warnings), compressed and always on |
124
+ | `SKILL.md` | T1-now, plus T2-future migration and deprecation warnings (Deep tier only) |
124
125
  | `references/` | Full temporal context with all tiers |
125
126
 
126
- ### Tier Constrains Authority
127
+ ### Tier and Authority
128
+
129
+ Your forge tier sets how strong a skill's accuracy guarantee can be:
127
130
 
128
- Your forge tier limits what authority claims a skill can make:
131
+ | Forge Tier | AST? | CCC? | QMD? | Accuracy Guarantee |
132
+ |-----------|------|------|------|-------------------|
133
+ | Quick | No | No | No | Best-effort |
134
+ | Forge | Yes | No | No | Structural (each export ast-grep matches is AST-verified) |
135
+ | Forge+ | Yes | Yes | No | Structural + semantic discovery |
136
+ | Deep | Yes | Optional (adds semantic discovery) | Yes | Full (structural + contextual + temporal) |
129
137
 
130
- | Forge Tier | AST? | CCC? | QMD? | Max Authority | Accuracy Guarantee |
131
- |-----------|------|------|------|---------------|-------------------|
132
- | Quick | No | No | No | `community` | Best-effort |
133
- | Forge | Yes | No | No | `official` | Structural (AST-verified) |
134
- | Forge+ | Yes | Yes | No | `official` | Structural + semantic discovery |
135
- | Deep | Yes | opt. (enhances when installed) | Yes | `official` | Full (structural + contextual + temporal) |
138
+ At every tier the structural guarantee covers the exports an ast-grep rule matched: an export it could not match is labeled T1-low and cited `[SRC:...]`, even in a Deep-tier skill.
136
139
 
137
- **Tier governs technical verification; authority is an ecosystem claim.** Reaching Deep tier unlocks the *capability* to claim `official` authority — it does not grant it. Only library maintainers can publish `source_authority: official` skills via the [agentskills.io](https://agentskills.io) open-format ecosystem. A Deep-tier skill compiled by a third party is `community` by default. See [oh-my-skills](https://github.com/armelhbobdad/oh-my-skills), where all four Deep-tier skills ship as `community` by design — audited, not blessed.
140
+ **Tier and authority are separate.** Tier says how deeply SKF could check the code. Authority (`source_authority`) says who stands behind the skill, and it comes from your brief, not from your tools. Brief Skill asks whether you maintain the library: a maintainer gets `official`, a private or company codebase gets `internal`, and everyone else gets `community`, the default. In a headless run where you do not set it, SKF picks `official` only when your GitHub login matches the repo owner. Quick Skill and docs-only skills are always `community`. Only library maintainers should publish `official` skills to the [agentskills.io](https://agentskills.io) open-format ecosystem, so a Deep-tier skill compiled by a third party stays `community`. See [oh-my-skills](https://github.com/armelhbobdad/oh-my-skills), where all four Deep-tier skills ship as `community` by design: audited, not blessed.
138
141
 
139
142
  ---
140
143
 
@@ -170,9 +173,11 @@ skills/{name}/
170
173
  └── ...
171
174
  ```
172
175
 
173
- Multiple versions coexist under the same skill name. The `active` symlink points to the current version. Updating a skill for a new library release creates a new version directory — users pinned to older versions keep their skill intact. The inner `{name}/` directory is a standalone [agentskills.io](https://agentskills.io) package, directly installable via `npx skills add`.
176
+ Multiple versions coexist under the same skill name. The `active` symlink points to the current version. Updating a skill for a new library release creates a new version directory, so users pinned to older versions keep their skill intact. The inner `{name}/` directory is a standalone [agentskills.io](https://agentskills.io) package, directly installable via `npx skills add`.
174
177
 
175
- The `scripts/` and `assets/` directories are optional — only created when the source repository contains executable scripts or static assets matching detection heuristics. Each file traces to its source via `[SRC:file:L1]` provenance citations with SHA-256 content hashes for drift detection. User-authored files go in `scripts/[MANUAL]/` or `assets/[MANUAL]/` subdirectories and are preserved during updates.
178
+ The `scripts/` and `assets/` directories are optional. SKF creates them only when the source repository contains executable scripts or static assets that match its detection rules. Each file traces to its source via `[SRC:file:L1]` provenance citations with SHA-256 content hashes for drift detection. User-authored files go in `scripts/[MANUAL]/` or `assets/[MANUAL]/` subdirectories and are preserved during updates.
179
+
180
+ SKF also keeps workspace files for each version outside the skill package, in `forge-data/{name}/{version}/` by default: `provenance-map.json` (where each documented symbol came from), `evidence-report.md`, `extraction-rules.yaml` and test reports. The brief, `skill-brief.yaml`, sits one level up in `forge-data/{name}/`. These files are not part of the installable package; see [Verifying a Skill](/docs/verifying-a-skill.md) for how to use them.
176
181
 
177
182
  ### SKILL.md Format
178
183
 
@@ -197,19 +202,19 @@ description: >
197
202
  ---
198
203
  ```
199
204
 
200
- Every instruction in the body traces to source:
205
+ Every instruction in the body traces to source, with a citation that names the tool that read it (`[AST:]` for an ast-grep match, `[SRC:]` for a read by eye):
201
206
 
202
207
  ```python
203
- await cognee.search( # [AST:cognee/api/v1/search/search.py:L26]
208
+ await cognee.search( # [AST:cognee/api/v1/search/search.py:L27]
204
209
  query_text="What does Cognee do?"
205
210
  )
206
211
  ```
207
212
 
208
- ### metadata.json — The Birth Certificate
213
+ ### metadata.json: The Birth Certificate
209
214
 
210
215
  Machine-readable provenance for every skill:
211
216
 
212
- This is a trimmed excerpt from the real [`oms-cognee/1.0.0/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/metadata.json) shipped with the oh-my-skills canonical output. Every value below is verbatim from the file — not illustrative.
217
+ This is a trimmed excerpt from the real [`oms-cognee/1.0.0/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/metadata.json) shipped with the oh-my-skills canonical output. Every value below is copied from the file, not made up for illustration.
213
218
 
214
219
  ```json
215
220
  {
@@ -218,7 +223,7 @@ This is a trimmed excerpt from the real [`oms-cognee/1.0.0/metadata.json`](https
218
223
  "skill_type": "single",
219
224
  "source_authority": "community",
220
225
  "source_repo": "https://github.com/topoteretes/cognee",
221
- "source_commit": "3c048aa4147776f14d4546704f986242554a9ef3",
226
+ "source_commit": "3c048aa4",
222
227
  "source_ref": "v1.0.0",
223
228
  "confidence_tier": "Deep",
224
229
  "spec_version": "1.3",
@@ -242,13 +247,17 @@ This is a trimmed excerpt from the real [`oms-cognee/1.0.0/metadata.json`](https
242
247
  }
243
248
  ```
244
249
 
245
- Fields omitted from this excerpt for brevity: `description`, `exports[]`, `tool_versions`, `dependencies`, `compatibility`, `last_update`, `generated_by`. The full 93-line file lives at [`oh-my-skills/skills/oms-cognee/1.0.0/oms-cognee/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/metadata.json).
250
+ Fields omitted from this excerpt for brevity: `source_root`, `description`, `exports[]`, `tool_versions`, `dependencies`, `compatibility`, `generated_by`, and a `last_update` that an earlier SKF version wrote. Update Skill now records `last_update` and `update_type` at the top level of `provenance-map.json` in `forge-data/{name}/{version}/`, and an update removes both from `metadata.json`, which marks an update only in `generation_date`. The full 93-line file lives at [`oh-my-skills/skills/oms-cognee/1.0.0/oms-cognee/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/metadata.json).
251
+
252
+ Two fields are easy to mix up. `confidence_tier` holds the forge tier a single skill like this one was compiled at (Quick, Forge, Forge+ or Deep). A stack skill records there the dominant confidence tier of its libraries (T1, T1-low, T2 or T3) and keeps its forge tier in `forge_tier`; Export Skill still accepts a forge tier from a stack made by an earlier SKF version, with a warning that running Stack Skill again records the dominant tier. `confidence_distribution` counts the claims at each confidence tier (T1, T1-low, T2, T3). In a stack it counts each library once, by the library's tier, so its bins sum to `library_count`.
246
253
 
247
- `scripts` and `assets` arrays are optional — omitted entirely (not empty) when the source has no scripts or assets.
254
+ The excerpt's `t1` count of 34 comes from an SKF version that labeled exports by the forge tier. This skill's provenance map records its exports as read by eye (`source-read`), which SKF 3.0.0 counts as `t1_low`: only an export an ast-grep rule matched counts as `t1` now, and `ast_node_count` counts only those exports.
255
+
256
+ `scripts` and `assets` arrays are optional: SKF leaves them out entirely, rather than writing empty arrays, when the source has no scripts or assets.
248
257
 
249
258
  ### Stack Skill Output
250
259
 
251
- Stack skills map how your dependencies interact — shared types, co-import patterns, integration points:
260
+ Stack skills map how your dependencies interact: shared types, co-import patterns and integration points.
252
261
 
253
262
  ```
254
263
  skills/{project}-stack/
@@ -266,36 +275,38 @@ skills/{project}-stack/
266
275
  └── pwa-auth.md # Cross-library pattern
267
276
  ```
268
277
 
269
- The primary source is your project repo. Component references trace to library repos. `skill_type: "stack"` in metadata.
278
+ In code-mode, the source is your project repo: SKF reads your dependency manifests and finds where libraries are imported together, and component references trace to library repos. In compose-mode, when there is no code yet, SKF builds the stack skill from skills you already compiled plus your architecture document, and labels any integration it infers. Either way, `metadata.json` records `skill_type: "stack"`.
270
279
 
271
280
  ---
272
281
 
273
282
  ## Dual-Output Strategy
274
283
 
275
- Every skill SKF compiles ships as **two** files on purpose — and the reason is empirical, not aesthetic.
284
+ Every skill SKF compiles ships as **two** files on purpose, and the reason is empirical, not aesthetic.
276
285
 
277
- > **[Vercel research](https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals):** passive context (`AGENTS.md` / `CLAUDE.md`) achieves a **100% pass rate** in agent evals. Active skills loaded alone achieve **79%**. The 21-point gap is what the dual-output strategy closes.
286
+ > **[Vercel research](https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals):** a compressed docs index in passive context (`AGENTS.md`) reached a **100% pass rate** in Vercel's agent evals. Skills peaked at **79%**, and only when the agent was told explicitly to use them; left to decide on its own, the agent gained nothing from the skill over having no docs at all (53%). The dual-output strategy is built to close that 21-point gap.
278
287
 
279
288
  Every skill generates both:
280
289
 
281
- 1. **`SKILL.md`** — Active skill, loaded on trigger with the full instruction set. This is the instruction manual your agent opens when it knows it needs library guidance.
282
- 2. **`context-snippet.md`** — Passive context, compressed to 80–120 tokens per skill. Injected into platform context files (`CLAUDE.md` / `AGENTS.md` / `.cursorrules`) only when `export-skill` is run. This is the ambient index that tells your agent the skill exists in the first place and should be opened for relevant work.
290
+ 1. **`SKILL.md`**: the active skill, loaded on trigger with the full instruction set. This is the instruction manual your agent opens when it knows it needs library guidance.
291
+ 2. **`context-snippet.md`**: passive context, compressed to about 80 to 120 tokens per skill (a Deep-tier skill whose gotchas carry breaking changes can run longer). Only `export-skill` injects it into platform context files (`CLAUDE.md` / `AGENTS.md` / `.cursorrules`). This is the ambient index that tells your agent the skill exists in the first place and should be opened for relevant work.
292
+
293
+ If you do not want SKF to touch those files, set `passive_context: false` in your preferences file (`_bmad/_memory/forger-sidecar/preferences.yaml`). Export then skips the snippet and the managed section.
283
294
 
284
- Without the snippet, the agent never knows to open `SKILL.md`. Without `SKILL.md`, the snippet has nothing to point at. **Both halves are load-bearing.** That's the 21-point delta.
295
+ Without the snippet, the agent has to decide on its own that a skill is relevant, and it often skips `SKILL.md`. Without `SKILL.md`, the snippet has nothing to point at. **Both halves are load-bearing.**
285
296
 
286
297
  ### Managed Context Section
287
298
 
288
299
  Export injects a managed section between markers:
289
300
 
290
- The block below is the real managed section currently in [`oh-my-skills/CLAUDE.md`](https://github.com/armelhbobdad/oh-my-skills/blob/main/CLAUDE.md), showing one of its four compiled skills. Every line is verbatim from the file:
301
+ The block below is the real managed section currently in [`oh-my-skills/CLAUDE.md`](https://github.com/armelhbobdad/oh-my-skills/blob/main/CLAUDE.md), showing one of its four compiled skills. Every line is copied from the file except the last one before `<!-- SKF:END -->`, which stands in for the three skills left out:
291
302
 
292
303
  ```markdown
293
- <!-- SKF:BEGIN updated:2026-04-13 -->
304
+ <!-- SKF:BEGIN updated:2026-04-25 -->
294
305
  [SKF Skills]|4 skills|0 stack
295
306
  |IMPORTANT: Prefer documented APIs over training data.
296
307
  |When using a listed library, read its SKILL.md before writing code.
297
308
  |
298
- |[oms-cognee v1.0.0]|root: .claude/skills/oms-cognee/
309
+ |[oms-cognee v1.0.0]|root: skills/oms-cognee/
299
310
  |IMPORTANT: oms-cognee v1.0.0 — read SKILL.md before writing cognee code. Do NOT rely on training data.
300
311
  |quick-start:SKILL.md#quick-start
301
312
  |api-v1: add(), cognify(), search(), memify(), update(), run_custom_pipeline(), visualize_graph(), datasets, prune, config, SearchType, pipelines, Drop, run_startup_migrations(), session, tracing
@@ -303,11 +314,11 @@ The block below is the real managed section currently in [`oh-my-skills/CLAUDE.m
303
314
  |key-types:SKILL.md#key-types — SearchType: GRAPH_COMPLETION (default), RAG_COMPLETION, CHUNKS, CHUNKS_LEXICAL, SUMMARIES, TEMPORAL, CODING_RULES, CYPHER, FEELING_LUCKY, GRAPH_COMPLETION_DECOMPOSITION (+5 more); Task, Drop, RememberResult, DataPoint, 5 Cognee* exceptions
304
315
  |gotchas: cognee.low_level REMOVED from public API in v1.0.0 (import from cognee.infrastructure.engine directly); cognee.run_migrations REPLACED by cognee.run_startup_migrations (relational + vector); cognee.delete is DEPRECATED since v0.3.9 (use cognee.datasets.delete_data or cognee.forget); cognee.pipelines restructured in v1.0.0 (package with Drop + lazy re-exports); cognee.agent_memory requires async function; cognee.serve() without url triggers Auth0 Device Code Flow; cognee.start_ui is sync and needs pid_callback arg; all add/cognify/search/memify/remember/recall/improve/forget/serve are async — always await.
305
316
  |
306
- |(three more skills — oms-cocoindex, oms-storybook-react-vite, oms-uitripled — omitted here for brevity; see the full file)
317
+ |(three more skills are left out here for brevity: oms-cocoindex, oms-storybook-react-vite and oms-uitripled; see the full file)
307
318
  <!-- SKF:END -->
308
319
  ```
309
320
 
310
- ~80-120 tokens per skill (version-pinned, retrieval instruction, section anchors, inline gotchas). Root paths are per-IDE — each of the 23 supported IDEs has its own skill directory (e.g., `.claude/skills/`, `.cursor/skills/`, `.github/skills/`, `.windsurf/skills/`). See [`skf-export-skill/assets/managed-section-format.md`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/skf-export-skill/assets/managed-section-format.md) for the complete IDE → Context File Mapping. Aligned with [Vercel's research](https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals) finding that indexed format with explicit retrieval instructions dramatically improves agent performance. Developer controls placement. Ferris controls content. Snippet updates only happen at `export-skill` — create and update are draft operations. An `.export-manifest.json` tracks which skills have been explicitly exported, preventing draft skills from leaking into the managed section.
321
+ A snippet aims for about 80 to 120 tokens per skill: the version, an instruction to read `SKILL.md`, section anchors and inline gotchas. A Deep-tier skill whose gotchas carry breaking changes can run longer, like the cognee entry above. Root paths are per-IDE: each of the 23 supported IDEs has its own skill directory (for example `.claude/skills/`, `.cursor/skills/`, `.github/skills/`, `.windsurf/skills/`). A repo that keeps all its skills in one shared folder can set `snippet_skill_root_override` in its SKF `config.yaml` instead, which is why the oh-my-skills root paths start with `skills/`. See [`skf-export-skill/assets/managed-section-format.md`](https://github.com/armelhbobdad/bmad-module-skill-forge/blob/main/src/skf-export-skill/assets/managed-section-format.md) for the complete mapping from IDE to context file. The format follows [Vercel's research](https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals) finding that an index with explicit retrieval instructions greatly improves agent performance. You decide where the section sits in the file; Ferris decides what goes between the markers. Create Skill and Update Skill also write `context-snippet.md`, but only as a draft inside the skill folder, and they never touch the managed section. Only `export-skill` adds a skill there, and an `.export-manifest.json` file records which skills you have exported, so drafts never leak into the managed section.
311
322
 
312
323
  ---
313
324
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Troubleshooting
3
- description: Common errors in Skill Forge — forge setup, ecosystem checks, tier confidence — and how to resolve them.
3
+ description: Common Skill Forge errors and how to fix them, from setup and tiers to skill ownership, updates, renames, Tessl Review and campaigns.
4
4
  ---
5
5
 
6
6
  If something isn't working, start here. For general setup help see [Getting Started → Need help?](/docs/getting-started.md#need-help).
@@ -11,57 +11,174 @@ If something isn't working, start here. For general setup help see [Getting Star
11
11
 
12
12
  ### "Setup cannot proceed: `uv` is not installed"
13
13
 
14
- Surfaced by `/skf-setup` On Activation when `uv --version` is missing on `$PATH`. SKF helpers depend on `uv` to auto-resolve their Python dependencies via PEP 723 inline metadata; bare `python3` ignores that metadata and would fail later with `ModuleNotFoundError: No module named 'yaml'`. The probe halts the workflow up-front with one cohesive diagnostic instead of letting five steps each fail individually.
14
+ Setup checks for `uv` when it starts, before it detects your tools or writes anything. SKF's helper scripts use `uv` to install the Python packages they need; plain `python3` skips that and later fails with `ModuleNotFoundError: No module named 'yaml'`. So setup stops at once with one clear message instead of failing partway through. Under `--headless` or `--quiet`, the same message arrives as the `error.reason` of an `SKF_SETUP_RESULT_JSON` line whose `status` is `"blocked"`. The helper that builds that line needs only the Python standard library, so setup uses the first of `python3`, `python` or `py -3` that runs on the machine. With none of them, the run's one line is the message alone. Pipelines should treat a run with no `SKF_SETUP_RESULT_JSON` line as a failure.
15
15
 
16
16
  **Fix:** install `uv` from <https://docs.astral.sh/uv/getting-started/installation/> and re-run `/skf-setup`. `uv` is documented as a runtime prerequisite in [Getting Started → Prerequisites](/docs/getting-started.md#prerequisites-full-reference).
17
17
 
18
- ### "Setup cannot proceed: `_bmad/skf/config.yaml` was not found"
18
+ ### "Setup cannot proceed: the SKF config file was not found"
19
19
 
20
- Surfaced by `/skf-setup` On Activation when the SKF install config is missing — typically because you invoked `/skf-setup` from a directory that is not an SKF-initialised project. The check runs before any file mutation so nothing is written.
20
+ Surfaced by `/skf-setup` when the SKF install config, `_bmad/skf/config.yaml`, is missing, usually because you ran `/skf-setup` from a folder where SKF is not installed. The check runs before setup writes anything. Under `--headless` or `--quiet`, the same message arrives as the `error.reason` of an `SKF_SETUP_RESULT_JSON` line whose `status` is `"blocked"`, but only when SKF's scripts are installed in the project and `uv` or a Python interpreter can run them. Usually they are not (the folder is not an SKF project, or the install lost its scripts), so nothing can build that line and the run's one line is the message alone. Pipelines should treat a run with no `SKF_SETUP_RESULT_JSON` line as a failure.
21
21
 
22
- **Fix:** from the project root, run `npx bmad-module-skill-forge install` (or `npx bmad-method install` and add SKF as a custom module — see [Getting Started → Install](/docs/getting-started.md#install)), then re-run `/skf-setup`. If you ARE in the right project but the file was deleted, restore it from version control or re-run the SKF installer. A separate "config.yaml is not valid YAML" diagnostic surfaces the parser error inline if the file exists but is malformed — open the file at the named path and repair the YAML.
22
+ Ferris makes the same check before he greets you and stops with "Cannot initialize. SKF is not installed in this project". Neither setup nor Ferris can fix this: setup reads the file and never writes it, and only the installer does, so both messages name the installer command below.
23
+
24
+ **Fix:** from the project root, run `npx bmad-module-skill-forge install` (or `npx bmad-method install` and add SKF as a custom module; see [Getting Started → Install](/docs/getting-started.md#install)), then re-run `/skf-setup`, or start Ferris again and give him SF. If you are in the right project but the file was deleted, restore it from version control or re-run the SKF installer. The installer also puts back SKF's scripts and knowledge files: Ferris stops with "Cannot initialize. SKF's scripts are missing from this project" when the config is there but the scripts are not, and KI says so when the knowledge index is missing. If the file exists but is malformed, setup stops with the same message Ferris shows instead: Ferris names the file and the parser error ("YAML parse error in ..."), so open `_bmad/skf/config.yaml` and repair the YAML. If its `sidecar_path` is missing or still holds a placeholder, both stop with the value to set.
23
25
 
24
26
  ### Forge reports ast-grep is unavailable
25
27
 
26
- If setup reports that ast-grep was not detected, install it to unlock the Forge tier: <https://ast-grep.github.io>. Re-run `@Ferris SF` afterward — your tier upgrades automatically.
28
+ If setup reports that ast-grep was not detected, install it to unlock the Forge tier: <https://ast-grep.github.io>. Re-run `@Ferris SF` afterward and your tier upgrades automatically. If `tier_override` is set in `_bmad/_memory/forger-sidecar/preferences.yaml`, setup keeps that tier instead; set it to `~` to use the detected one.
27
29
 
28
30
  ### "No skill brief found"
29
31
 
30
- Run `@Ferris BS` first to create a skill brief, or use `@Ferris QS` for brief-less generation. `CS` always requires a brief — either a `skill-brief.yaml` produced by `BS` (or `AN`), or pass the skill name so it resolves one from your forge-data folder. For brief-less generation use `QS`.
32
+ Create Skill (`CS`) always needs a skill brief. Given a skill name, it loads `<forge_data_folder>/<skill-name>/skill-brief.yaml`; given a path, it loads that brief file. Run with no brief path, skill name or `--batch`, it loads the only brief in `forge_data_folder` and names it in its banner, and with several briefs there it asks which one to compile. A headless run that finds several stops with exit code 2 (`brief-missing`) and names them: pass the brief's path or skill name, or `--batch` to compile them all. "No skill brief found" means the brief you named does not exist or, with nothing named, that `forge_data_folder` holds no brief.
33
+
34
+ **Fix:** run `@Ferris BS` to write a brief (or `@Ferris AN` to get recommended briefs for a large repo), then run `@Ferris CS <skill-name>`. To make a skill without a brief, use `@Ferris QS` instead.
31
35
 
32
- ### "Ecosystem check: official skill exists"
36
+ ### "Ecosystem match found"
33
37
 
34
- An official skill already exists for this package. Consider installing it with `npx skills add` instead of generating your own — the official skill is typically better tested and kept up-to-date by the library maintainer.
38
+ No run stops here today. Quick Skill has a step that checks for an official skill that already covers your source, but agentskills.io offers no registry API to ask, so the step skips the check and Quick Skill goes straight on to extraction. Create Skill has no such check since 3.0.0. Once a registry API lists an official skill for your source, Quick Skill will show it with three choices: **[P] Proceed** compiles your own skill anyway, for a different scope or custom content; **[I] Install** stops so you can install the official skill instead; **[A] Abort** cancels. A headless run will pick **[P]**. When you already know of an official skill that fits your needs, installing it with `npx skills add <skill-name>` is usually the better choice, because the library's maintainers test it and keep it current.
35
39
 
36
40
  ### Quick-tier skills have lower confidence scores
37
41
 
38
- Quick tier reads source without AST analysis, so signatures are read directly from files rather than structurally verified. Install ast-grep to upgrade to the Forge tier for AST-verified signatures (T1 confidence) — see [Capability Tiers](/docs/concepts.md#capability-tiers-quickforgeforgedeep).
42
+ Quick tier reads source without AST analysis, so signatures are read directly from files rather than structurally verified, and its claims carry the T1-low confidence label. Install ast-grep to upgrade to the Forge tier, where each export an ast-grep rule matches is AST-verified and labeled T1. The label follows the tool that read the export, not the tier: an export ast-grep cannot match, because it cannot parse the file or no rule fits the export, is still read by eye and labeled T1-low, at Forge, Forge+ and Deep too. See [Confidence Tiers](/docs/concepts.md#confidence-tiers-t1t1-lowt2t3).
39
43
 
40
44
  ### Want semantic discovery for large codebases?
41
45
 
42
- Install [cocoindex-code](https://github.com/cocoindex-io/cocoindex-code) to unlock the Forge+ tier. CCC indexes your codebase and pre-ranks files by semantic relevance before AST extraction, improving coverage on projects with 500+ files.
46
+ Install [cocoindex-code](https://github.com/cocoindex-io/cocoindex-code) (the `ccc` command) alongside ast-grep to unlock the Forge+ tier, then re-run `@Ferris SF`. CCC indexes your codebase and ranks its files by meaning, so a step that reads files one at a time reads the most relevant ones first, which helps most on projects with 500+ files. The ast-grep recipe runner reads every file in scope either way.
47
+
48
+ ### `git status` lists a `.cocoindex_code` folder inside a source folder
49
+
50
+ When ccc is available (Forge+, or Deep with ccc), create-skill indexes the skill's source with it. A local source folder inside your project or inside another git checkout (a subfolder such as `./packages/lib`, a linked worktree or a submodule) becomes a ccc project of its own, and ccc does not gitignore an index there. create-skill keeps it out of git by writing a `.gitignore` holding `*` inside that `.cocoindex_code/` folder, and says so in one line; it never edits your own `.gitignore`. For a folder an earlier SKF release left untracked, run create-skill for that source again, or create `<source>/.cocoindex_code/.gitignore` holding the single line `*`. If you already committed the index, `git rm -r --cached <source>/.cocoindex_code` stops tracking it.
43
51
 
44
52
  ### `@Ferris deepwiki` shows a deprecation notice
45
53
 
46
- The auto pipeline was briefly named `deepwiki`; it's now [`forge-auto`](/docs/forge-auto.md) — renamed to avoid confusion with the DeepWiki MCP, since the pipeline compiles a verified skill from source and does **not** call that MCP. `deepwiki` still works (it resolves to `forge-auto`) but prints a one-time notice. Switch your commands to `@Ferris forge-auto <repo-or-doc-url>`.
54
+ The auto pipeline was briefly named `deepwiki`; it's now [`forge-auto`](/docs/forge-auto.md). It was renamed to avoid confusion with the DeepWiki MCP server, since the pipeline compiles a verified skill from source and does **not** call that server. `deepwiki` still works (it resolves to `forge-auto`) but prints a one-time notice. Switch your commands to `@Ferris forge-auto <repo-or-doc-url>`.
47
55
 
48
56
  ### `@Ferris onboard` returns an error
49
57
 
50
58
  The `onboard` alias was removed. Its replacement is [`forge-auto`](/docs/forge-auto.md), which does everything `onboard` did plus auto-scope, auto-brief, and a stricter 90% quality gate. Run `@Ferris forge-auto <repo-or-doc-url>` instead.
51
59
 
60
+ ### Test Skill stops with `workspace-drift`
61
+
62
+ Test Skill checks a skill against the source commit it was made from. When the source folder's git checkout is at a different commit from the one the skill records (`source_commit` in its `metadata.json`), the results would show false gaps, so Test Skill stops before it writes a report.
63
+
64
+ **Fix:** check out the pinned commit the message shows with `git -C <source> checkout <pinned commit>`, then re-run `@Ferris TS <name>`. The checkout line in the message names the skill's `source_ref` when it has one. When `source_ref` is a branch, that line does not move a checkout that is already on a newer commit of the branch. To test against the source as it is now, re-run with `--allow-workspace-drift`: the findings then describe the current checkout, and a pass under that flag does not clear the skill for export until you re-test at the pinned commit. Right after an update, follow the update's report instead (see "Update Skill stops with `blocked` before detecting changes").
65
+
52
66
  ### forge-auto halted at the Test stage
53
67
 
54
- forge-auto runs Test Skill with a stricter **90% quality threshold** (vs the default 80%), so a skill that scores below 90% halts at TS with a gap report rather than exporting a weak skill. Run `@Ferris US` to address the gaps it lists, then `@Ferris TS EX` to re-test and export. If 90% is stricter than you need, run the individual workflows or `forge` instead, which use the default threshold.
68
+ forge-auto aims for 90%, stricter than the default 80%. A score of at least 80% but under 90% still passes, with an `evidence-report-fallback.md` that records the shortfall, unless a cap fired. TS stops the pipeline on any verdict but PASS: every FAIL (a score below 80%, a Critical or High gap at the hard gate, or a cap that turned a pass into a fail whatever the score), INCONCLUSIVE, and pass-with-drift. Run `@Ferris US <name> --from-test-report` to repair the gaps the report lists, then `@Ferris TS[<name>] EX` to test and export again (the brackets give Test Skill the skill's name). A plain `@Ferris US <name>` finds a failed or pass-with-drift test report that is newer than the skill and that no repair has applied, and offers to repair its gaps; a headless run checks the source for changes instead and adds an `unconsumed-test-report` warning. For INCONCLUSIVE, add evidence as [Pass/fail](/docs/verifying-a-skill.md#passfail) describes; for pass-with-drift, test again at the pinned commit. If 90% is stricter than you need, run the individual workflows or `forge` instead, which use the default threshold.
69
+
70
+ ### "Inventory scan unreliable"
71
+
72
+ Surfaced by Verify Stack and Refine Architecture (exit `7`, `inventory-unreliable`) when there is more than one warning for every four skills SKF generated. Each of these counts as a warning: a `metadata.json` or version folder SKF cannot read, a skill SKF generated with no `SKILL.md` or no exports found in `metadata.json`, `references/` or `SKILL.md`, or a `composes` cycle. Skills SKF did not generate, such as a module's own skills in a shared `skills_output_folder`, are listed once as "Skipped (not SKF output)" and never count. A `metadata.json` SKF cannot read counts whoever made the skill, because SKF then cannot tell whether it generated that skill.
73
+
74
+ **Fix:** the message names each warning. Re-save an unreadable `metadata.json` as a plain UTF-8 JSON object, without comments or a byte-order mark, or restore it from version control; when another tool owns that skill and needs the file as it is, move the skill out of `skills_output_folder`. Regenerate a skill whose exports are missing with the workflow that made it (`@Ferris CS <name>`, `@Ferris QS` for a Quick Skill, or `@Ferris SS` for a stack skill). For a `composes` cycle, the named skills list each other, directly or through other skills, in the `composes` field of their `metadata.json`: remove the loop from one of those lists. Then re-run.
75
+
76
+ ### "`<name>` is not SKF output"
77
+
78
+ SKF only writes into, migrates, renames or purges a skill whose `metadata.json` carries SKF's marker. A folder in `skills_output_folder` without that marker, such as a BMad module's own skills or skills another tool installed, makes the workflow stop before it changes anything when:
79
+
80
+ - create-skill, quick-skill or create-stack-skill would write a new version into it;
81
+ - update-skill, export-skill, audit-skill or test-skill would move a flat skill in it into the versioned layout;
82
+ - drop-skill would delete it, or rename-skill would rename it.
83
+
84
+ Drop and rename also refuse a skill folder that mixes SKF output with other files. Rename and the three writers refuse an SKF skill that is still in the old flat layout (`flat-layout`). Drop and rename check the skill's folder in `forge_data_folder` too. They refuse one that mixes SKF's brief and reports with other files, and rename also refuses one that is a link, is not a folder, or cannot be listed. A folder there that SKF did not generate, such as another tool's folder of the same name, stays where it is, and both list it as "Left in place (not SKF output)". Verify Stack, Refine Architecture and compose-mode Stack Skill never stop on such skills. They list them once as "Skipped (not SKF output)" and leave them out of every inventory check, unless SKF cannot read a skill's `metadata.json` (see "Inventory scan unreliable").
85
+
86
+ **Fix:** a `skills_output_folder` shared with skills from elsewhere is supported, and SKF leaves the skills it did not generate alone, so manage `<name>` yourself (to remove it, delete its folder). For create-skill, set a different `name` in the brief to create the skill beside that folder; for create-stack-skill, pass another `stack_name` (or choose a different `project_name`); Quick Skill names a skill after its target, so use Brief Skill and Create Skill to pick another name. If the entries SKF names are in `forge_data_folder/<name>/`, move your own files out of that folder (for a link, replace it with the folder it points to; for a path that is not a folder or cannot be listed, move it out of the way or fix its permissions), then re-run. Relocate only when the folder holds a module's own source rather than skills: then set `skills_output_folder` in `_bmad/skf/config.yaml` to a folder of its own, move your SKF skills there, and re-run `/skf-setup`. If SKF did generate the skill and its `metadata.json` was edited or lost, restore that file; if the message says SKF cannot read it (for example `Unexpected UTF-8 BOM`), re-save it as plain UTF-8. For `flat-layout`, run `@Ferris TS <name>` once to move the skill into the versioned layout, then re-run the workflow that stopped. If the entries SKF names include a version folder with no `metadata.json`, an interrupted update-skill, create-skill, quick-skill or create-stack-skill run may have left it: delete that folder, then re-run the workflow. An entry named `<version>/<entry>` is a file or folder placed inside an SKF version folder: move it out of `<name>/<version>/`, then re-run.
87
+
88
+ **`<name>` still uses the flat layout:** update-skill `--detect-only` and `--dry-run` never move a skill, but they need the versioned layout, so they stop on an SKF skill that is still flat. Run `@Ferris US <name>` once without the flag (or AS, TS or EX) to move it into the versioned layout, then re-run with the flag.
89
+
90
+ **Skills an earlier SKF already moved:** an SKF release without this check could move a module's flat skill into `<name>/<version>/<name>/` and add an `active` link. Recover it from version control: `git status` shows what moved, `git restore <skills-folder>/<name>` brings back the original files, and you then delete the `<version>/` folder and `active` link that SKF added. The same recovery applies when an SKF release without this check wrote a new version into such a folder: delete the `<version>/` folder and `active` link it added, and restore any file it replaced with `git restore`. Until you recover them, `/skf-setup` keeps those skills in the ccc search index as long as none of their version folders carries the SKF marker. It warns when the skills folder holds no SKF output at all.
91
+
92
+ **`skills_output_folder` or `forge_data_folder` set to `_bmad-output`:** create-skill stages a skill in `_bmad-output/.skf-stage/<name>/` before it writes the version. An earlier SKF release staged it in `_bmad-output/<name>/`, which with this setting is also the skill's folder or its forge folder, and left `SKILL.md`, `metadata.json`, `context-snippet.md`, `references/`, `evidence-report.md` and `provenance-map.json` at the root of that folder. That leftover can make create-skill stop with `flat-layout`, and make drop and rename refuse the skill folder or its forge folder as one that holds entries SKF did not generate. Delete those leftovers yourself and keep everything else in the folder, such as the `<version>/` folders, the `active` link and `skill-brief.yaml`; when the folder holds nothing but the leftovers, delete it whole. Then re-run.
93
+
94
+ ### Rename Skill stops with `verify-failed`
95
+
96
+ Surfaced by `@Ferris RS` (exit `5`) when the old name is still in the renamed skill's files. Before it deletes anything, rename checks each version's `SKILL.md` frontmatter, `metadata.json`, `context-snippet.md` and `provenance-map.json` for the old name as a whole name: a longer name that contains it, such as `<old>-kit`, does not count. In the two JSON files it skips the values of `source_repo`, `source_root`, `source_commit`, `source_ref`, `source_package` and `source_library`: they name the source the skill was made from, not the skill, and rename leaves them as they are. On a match it removes the new folders and stops, so the skill keeps its old name and every file as it was. The message names each file and line.
97
+
98
+ Rename rewrites the skill's `name` fields, the name where the snippet template writes it (the header, the `|IMPORTANT:` line and the `root:` path) and paths into the skill's own folders, such as a test report path an update run recorded. It leaves every other mention, because there the old name may mean something other than the skill. The source values above and the paths of files in the source stay as they are even when they look like a path into the skills folder, as in a repository that keeps its packages under `skills/<name>/`.
99
+
100
+ **Fix:** match the line the message names:
101
+
102
+ - **The skill is named after its library or repository**, as Quick Skill names a skill, and a value that rename does not skip names the library or the repository: the `description` in the `SKILL.md` frontmatter or in `metadata.json`, an export that has the library's name, the path of a file in the source such as `skills/<name>/scripts/fill.py`, or, for a skill named like its repository, the README URL create-skill records in `metadata.json` `doc_sources`. A rename does not rename the library. Such a skill cannot be renamed. Create it again under the new name with Brief Skill and Create Skill.
103
+ - **A note an earlier run wrote in its own words**, such as an `update_source` value in `metadata.json` that names the skill: edit or remove it in the old skill's file, then re-run the rename.
104
+ - **A `context-snippet.md` line other than the header, `|IMPORTANT:` and `root:`** names the skill, for example its `|gotchas:` text: edit that line in the old skill's snippet, then re-run. When the old name is a label or fixed word of the snippet template itself (`api`, `root`, `data`), the skill cannot be renamed; create it again under the new name.
105
+
106
+ ### Rename Skill stops with `halted-for-concurrent-run`
107
+
108
+ Surfaced by `@Ferris RS` (exit `5`) when another rename of the same skill holds its run lock, `.skf-rename-<name>.lock` in `forge_data_folder`, and the lock has not gone stale (60 minutes after it was taken or renewed). A rename that waited at a question past that time stops the same way before it copies anything, because another rename may have run in the meantime. `--dry-run` takes no lock.
109
+
110
+ **Fix:** wait until the other rename ends, then run the rename again. If no rename of that skill is running, delete the lock file the message names, or wait until the time it gives.
111
+
112
+ ### Rename Skill stops with `name-collision` and lists old folders
113
+
114
+ Surfaced by `@Ferris RS` (exit `5`) when an earlier rename of the skill to the same new name stopped after it moved the export manifest entry to the new name, but before it deleted the old folders. The new name is now the renamed skill. The message lists the old folders still on disk, and the run changes nothing.
115
+
116
+ **Fix:** if you do not want to keep the old skill, run the checked delete the message gives (`skf-skill-inventory.py guarded-delete` with those folders), then run `@Ferris EX` to rebuild the context files that may still name the old skill. A `name-collision` without that list means the new name is already in use: pick another one.
117
+
118
+ ### Update Skill stops with `blocked` before detecting changes
119
+
120
+ Surfaced by `@Ferris US` for a skill built at Forge tier or above from a remote repository, or when `--target-ref` is passed for any other skill (under `--headless`, `error.phase` is `init:source-tree`). Update Skill reads the commit that the skill's `source_ref` points to now, or the tag, branch or commit passed with `--target-ref`, so every step compares the skill with one known commit. It stops before comparing anything when it cannot get that commit, and `error.reason` says why:
121
+
122
+ - `ref-not-found`: the ref no longer exists upstream. `invalid-ref`: the ref is not a valid tag or branch name.
123
+ - `upstream-unreachable`: the repository cannot be reached, and either `--target-ref` was passed (it always needs the network) or the skill's pinned commit is not on this machine.
124
+ - `fetch-failed` or `checkout-failed`: git could not fetch or check out the commit, for example after a dropped connection or on a full disk.
125
+ - `timed-out`: reading the commit did not finish within the time limit Update Skill gives it; a first fetch of a large repository is slow.
126
+ - `tree-folder-failed`: no folder for the checkout could be created, neither in SKF's own cache folder nor in the system temp folder.
127
+ - `git-unavailable`: `git` is not installed. `helper-failed`: `skf-source-tree.py` is missing, or it was stopped before it printed a result.
128
+ - `target-ref-needs-remote-source`: `--target-ref` was passed for a skill built from a local folder, from documentation only, or at Quick tier.
129
+
130
+ **Fix:** for `upstream-unreachable`, `fetch-failed` or `timed-out`, check your network and your access to the repository, then re-run. For `checkout-failed` or `tree-folder-failed`, free disk space and check that you can write to those folders. Install `git` for `git-unavailable`, and re-install SKF for `helper-failed`. When the tag or branch was deleted or renamed upstream, pass the one to use with `--target-ref <tag|branch|HEAD>`; the skill then records it as its `source_ref`. When only the network is down, `--target-ref` was not passed and the pinned commit is on this machine, Update Skill does not stop: it compares that commit, and its report and `warnings[]` say that upstream changes were not checked (`source-not-fetched`).
131
+
132
+ If Test Skill stops with `workspace-drift` right after an update, the update's report says why the source that Test Skill reads was not moved to the commit the update recorded (`workspace-clone-not-updated`). It also gives the `git` commands that move it there once no other skill needs it where it is. Use those commands, not the `git checkout` that Test Skill's own message suggests: for a branch or `HEAD`, that checkout does not reach the new commit.
133
+
134
+ ### Update Skill stops with `halted-for-write-failure` because the version already exists
135
+
136
+ Surfaced by `@Ferris US` (under `--headless`, `error.phase` is `merge:new-version-folder`). An update that writes puts the new version of the skill in a folder of its own and never overwrites an existing one. The new version is the source's version when the skill was built from a remote repository and that version is higher; otherwise it is the next patch version. It updates the version the skill's `active` link names, so a second update before an export builds on the first. It stops before writing anything when `<skills_output_folder>/<name>/<version>/` or `<forge_data_folder>/<name>/<version>/` already exists. The version it updates is unchanged.
137
+
138
+ **Fix:** if an earlier update stopped after creating that version, delete both folders (whichever exist) by hand, then re-run. If you keep that version on purpose, move both folders out of the way by hand before updating. Never remove the version the `active` link names. Drop Skill removes a single version only when the export manifest lists it (`@Ferris DS <name> --mode purge`, choosing that version); for a skill that was never exported it can only drop every version, and a soft drop (`--mode deprecate`) keeps the files on disk.
139
+
140
+ ### Update Skill stops with `halted-for-concurrent-run`
141
+
142
+ Surfaced by `@Ferris US` when another update of the same skill holds its run lock, `.skf-update.lock` in `<forge_data_folder>/<name>/` (under `--headless`, `error.phase` is `init:concurrency-guard`). The message names the update that holds the lock, the lock file, and when the lock goes stale (60 minutes after it was taken or renewed). `--detect-only` and `--dry-run` take no lock.
143
+
144
+ **Fix:** wait until the other update ends, then re-run. If no update of that skill is running (a session that crashed or was closed leaves its lock behind), delete the lock file the message names, or wait until the time it gives. An update that finds a stale lock takes it over and undoes what the interrupted update left half written.
145
+
146
+ **`run-lock-lost`:** the same status with this reason means the update waited at a question past the stale time, so another update may have changed the skill (`error.phase` is `merge:run-lock` or `write:run-lock`). It stops before it writes `metadata.json`, and the halt undoes anything the update already wrote: it removes the new version folders, or, for a repair from a test report, restores the files it edited in place from the copy it took first, and the message says which. Re-run the update once no other update of that skill runs; if a version folder the message names is still on disk, delete it first.
147
+
148
+ ### A report says `Tessl Review: off`, `not run`, `no result` or `failed`
149
+
150
+ Create Skill and Test Skill record one `Tessl Review:` line in the evidence report and the test report. Tessl Review is optional and never stops a run, so the line says why it produced no score:
151
+
152
+ | Status | What it means and what to do |
153
+ |---|---|
154
+ | `off` | The default. Set `tessl_review_workspace` in `_bmad/_memory/forger-sidecar/preferences.yaml` to the name of one of your Tessl workspaces (`tessl workspace list` shows them) to enable it. The review uploads the skill's `SKILL.md`, `references/`, `scripts/` and `assets/` to Tessl, where it stays in that workspace's history, and each fresh review spends Tessl credits. |
155
+ | `invalid-config` | `tessl_review_workspace` is set to something that is not a workspace name, such as `true`, a value with spaces or one with characters other than letters, digits, `.`, `_` and `-`. Set it to the workspace name, or to `~` to turn the review off. |
156
+ | `not-installed` | Neither `tessl` nor a cached npm copy of it was found. Install the Tessl CLI (see [tessl.io](https://tessl.io)); SKF never installs it. |
157
+ | `signed-out` | Run `tessl login`, or set `TESSL_TOKEN` for an unattended run. |
158
+ | `command-unavailable` | The installed tessl has no working `tessl review run`. Update tessl. |
159
+ | `pending` | The workflow stopped checking before Tessl finished. The review may still complete on Tessl's side: `tessl review view <run id>` shows it (the line names the run id); re-run the workflow later. |
160
+ | `unknown-run` | Tessl has no review with the run id the workflow checked, or the workflow passed something that is not a run id. Re-run the workflow; `tessl review list` shows your reviews. |
161
+ | `timeout` | The workflow did not see Tessl finish while it waited (about ten minutes): Tessl was still working, or the last checks failed or did not answer. The review may still complete on Tessl's side: `tessl review view <run id>` shows it (the line names the run id); re-run the workflow later. |
162
+ | `failed` | The line carries tessl's own message, a skill file SKF could not read, or a tessl call that did not answer in time. When it is about the workspace, check the name against `tessl workspace list`. `did not answer within` means tessl was slow, for example while its npm launcher downloads tessl on a first run: re-run the workflow. `stopped before skf-tessl-review.py reported a result` means your agent's shell tool stopped a helper call; when Tessl had accepted the review, the report names its run id for `tessl review view <run id>`. |
163
+ | `parse-failure` | tessl printed no review SKF can read. Update tessl, or run `tessl review run <skill-folder> --json` yourself to see its output. |
164
+
165
+ When Tessl Review produces no score, Test Skill's External Validation uses skill-check's score alone.
166
+
167
+ ### "Description sanitization failed"
168
+
169
+ Create Skill checks the staged skill's frontmatter `description` for `<` and `>` before it writes the skill, because the Claude platform does not accept XML tags there. When it finds them, it replaces them with `{` and `}` and checks again; this message means they were still there after that, so nothing was written to `skills_output_folder`. Under `--headless` the stderr envelope carries `halt_reason: "description-angle-brackets"`.
170
+
171
+ **Fix:** check that `_bmad-output/.skf-stage/<name>/SKILL.md` can be written (its permissions, and no other program holding it open), then re-run `@Ferris CS`. To keep angle brackets out of the description from the start, write placeholders in the brief as `{name}` or `NAME` rather than `<name>`.
55
172
 
56
- ### My campaign stopped partway — how do I resume?
173
+ ### My campaign stopped partway: how do I resume?
57
174
 
58
- Campaign is designed for exactly this. State lives in `_campaign-state.yaml` on disk, so context death, a session timeout, or a machine restart loses nothing. Run `@Ferris campaign resume` — Ferris validates the state file, skips completed skills, and picks up from the next incomplete skill in dependency order. If the state file is corrupted, Ferris falls back to the `.bak` copy automatically. To re-process one specific skill, use `@Ferris campaign resume --from=<skill>`.
175
+ Campaign is designed for exactly this. Its state lives on disk in `_campaign-state.yaml` (by default in `forge-data/_campaign/`), so context death, a session timeout, or a machine restart loses nothing. Run `@Ferris campaign resume`. Ferris validates the state file, skips completed skills, and picks up from the next incomplete skill in dependency order. If the state file is corrupted, Ferris restores the `.bak` copy automatically when that copy is valid; when neither file is usable, it stops and shows both errors. To process one specific skill again, use `@Ferris campaign resume --from=<skill>`; for a skill that already finished, choose **[R]e-run** when asked.
59
176
 
60
177
  ---
61
178
 
62
179
  ## Still stuck?
63
180
 
64
181
  1. Run `@Ferris SF` to check your tool availability and current tier
65
- 2. Check `forge-tier.yaml` in your forger sidecar for your configuration
66
- 3. If `/bmad-help` is installed (via full BMAD Method), run it and describe your state — e.g. `/bmad-help my batch creation failed halfway, how do I resume?`
67
- 4. [File an issue](https://github.com/armelhbobdad/bmad-module-skill-forge/issues/new/choose) — SKF's [health check system](/docs/workflows.md#terminal-step-health-check) is the primary feedback channel, and manual issues feed the same pipeline
182
+ 2. Check `_bmad/_memory/forger-sidecar/forge-tier.yaml` for the tools setup detected and your current tier
183
+ 3. If `/bmad-help` is installed (via full BMAD Method), run it and describe your state, for example `/bmad-help my batch creation failed halfway, how do I resume?`
184
+ 4. [File an issue](https://github.com/armelhbobdad/bmad-module-skill-forge/issues/new/choose). SKF's [health check system](/docs/workflows.md#terminal-step-health-check) is the main way SKF collects feedback, and issues you file by hand reach the same place.