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
@@ -0,0 +1,284 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/armelhbobdad/bmad-module-skill-forge/src/shared/scripts/schemas/skf-create-skill-result-envelope.v1.json",
4
+ "title": "SKF_CREATE_SKILL_RESULT_JSON envelope (v1)",
5
+ "description": "Single-line JSON document skf-create-skill prints, prefixed with the literal 'SKF_CREATE_SKILL_RESULT_JSON: ': on stdout when step 8 (report) finishes a brief, once per brief of a --batch run, and on stderr at every HARD HALT of steps 1 to 7. The shared emitter (skf-emit-result-envelope.py) builds each line from the payload a step stages in the brief's run folder, folds in the auto-decisions and warnings the run recorded there, derives exit_code from halt_reason, stamps timestamp, run_id and result_path, and checks the line against this schema, so the model never types it. The skill's SKILL.md Workflow Rules give the halt command, and references/report.md the finished run's.",
6
+ "$defs": {
7
+ "skf-envelope": {
8
+ "description": "The shared emitter's settings for this workflow, read by skf-emit-result-envelope.py: the workflow, the line's prefix, the wrapper, the status a halt carries, the exit code of each halt_reason and the result file stem. Nothing in the schema references this entry, so it constrains no envelope.",
9
+ "const": {
10
+ "workflow": "skf-create-skill",
11
+ "prefix": "SKF_CREATE_SKILL_RESULT_JSON",
12
+ "wrapper": null,
13
+ "halt_status": "failed",
14
+ "exit_codes": {
15
+ "brief-missing": 2,
16
+ "brief-malformed": 2,
17
+ "brief-invalid": 2,
18
+ "forge-tier-missing": 3,
19
+ "source-not-found": 3,
20
+ "helper-missing": 3,
21
+ "docs-unreachable": 3,
22
+ "write-failed": 4,
23
+ "staging-unreadable": 4,
24
+ "not-skf-output": 5,
25
+ "flat-layout": 5,
26
+ "tier1-not-preserved": 5,
27
+ "shard-xref-broken": 5,
28
+ "description-angle-brackets": 5,
29
+ "references-missing": 5,
30
+ "active-link-blocked": 5,
31
+ "halted-for-brief-refinement": 6
32
+ },
33
+ "success_exit_code": 0,
34
+ "result_file": "create-skill-result"
35
+ }
36
+ }
37
+ },
38
+ "type": "object",
39
+ "additionalProperties": false,
40
+ "required": [
41
+ "status",
42
+ "exit_code",
43
+ "phase",
44
+ "halt_reason",
45
+ "error",
46
+ "outputs",
47
+ "summary",
48
+ "skill_package",
49
+ "timestamp",
50
+ "run_id",
51
+ "result_path",
52
+ "headless_decisions",
53
+ "warnings"
54
+ ],
55
+ "properties": {
56
+ "status": {
57
+ "type": "string",
58
+ "enum": ["success", "partial", "failed"],
59
+ "description": "'success' when step 8 finished the brief, 'partial' when it finished a source brief whose extraction found no export (summary.warning 'zero-exports'), 'failed' at every HARD HALT, also one after step 7 promoted the package (skill_package and outputs then name what is on disk)."
60
+ },
61
+ "exit_code": {
62
+ "type": "integer",
63
+ "enum": [0, 2, 3, 4, 5, 6],
64
+ "description": "Derived from halt_reason: null gives 0; brief-missing, brief-malformed and brief-invalid 2; forge-tier-missing, source-not-found, helper-missing and docs-unreachable 3; write-failed and staging-unreadable 4; not-skf-output, flat-layout, tier1-not-preserved, shard-xref-broken, description-angle-brackets, references-missing and active-link-blocked 5; halted-for-brief-refinement 6."
65
+ },
66
+ "phase": {
67
+ "type": ["string", "null"],
68
+ "minLength": 1,
69
+ "description": "The step slug where the HARD HALT fired: load-brief, extract, component-extraction, fetch-docs, compile, doc-sources, auto-shard, validate or generate-artifacts, or batch-mode for a --batch run whose batch could not start or go on. Null on a finished run."
70
+ },
71
+ "halt_reason": {
72
+ "type": ["string", "null"],
73
+ "enum": [
74
+ null,
75
+ "brief-missing",
76
+ "brief-malformed",
77
+ "brief-invalid",
78
+ "forge-tier-missing",
79
+ "source-not-found",
80
+ "helper-missing",
81
+ "docs-unreachable",
82
+ "write-failed",
83
+ "staging-unreadable",
84
+ "not-skf-output",
85
+ "flat-layout",
86
+ "tier1-not-preserved",
87
+ "shard-xref-broken",
88
+ "description-angle-brackets",
89
+ "references-missing",
90
+ "active-link-blocked",
91
+ "halted-for-brief-refinement"
92
+ ],
93
+ "description": "Null on a finished run. The failure class of a HARD HALT, the same value as error.code and summary.halt_reason: pipelines branch on it without parsing the message."
94
+ },
95
+ "error": {
96
+ "oneOf": [
97
+ { "type": "null" },
98
+ {
99
+ "type": "object",
100
+ "additionalProperties": false,
101
+ "required": ["code", "message"],
102
+ "properties": {
103
+ "code": {
104
+ "type": "string",
105
+ "enum": [
106
+ "brief-missing",
107
+ "brief-malformed",
108
+ "brief-invalid",
109
+ "forge-tier-missing",
110
+ "source-not-found",
111
+ "helper-missing",
112
+ "docs-unreachable",
113
+ "write-failed",
114
+ "staging-unreadable",
115
+ "not-skf-output",
116
+ "flat-layout",
117
+ "tier1-not-preserved",
118
+ "shard-xref-broken",
119
+ "description-angle-brackets",
120
+ "references-missing",
121
+ "active-link-blocked",
122
+ "halted-for-brief-refinement"
123
+ ],
124
+ "description": "The halt_reason."
125
+ },
126
+ "message": {
127
+ "type": "string",
128
+ "minLength": 1,
129
+ "description": "The halt's reason, the one-line form of the message the step displayed."
130
+ },
131
+ "phase": {
132
+ "type": "string",
133
+ "minLength": 1,
134
+ "description": "The step slug where the halt fired."
135
+ },
136
+ "path": {
137
+ "type": "string",
138
+ "minLength": 1,
139
+ "description": "The file or folder the halt names, when it names one (a missing helper's probe path, the folder a write or the ownership check refused)."
140
+ },
141
+ "details": {
142
+ "description": "Optional halt-specific context, such as the Tier 1 sections a split moved (details.tier1_missing) or the doc URLs that failed (details.failed_urls)."
143
+ }
144
+ }
145
+ }
146
+ ],
147
+ "description": "Null on a finished run. The failure of a HARD HALT."
148
+ },
149
+ "outputs": {
150
+ "type": "object",
151
+ "default": {},
152
+ "additionalProperties": false,
153
+ "properties": {
154
+ "skill_md": { "type": "string", "minLength": 1, "description": "Path of {skill_package}/SKILL.md." },
155
+ "context_snippet": { "type": "string", "minLength": 1, "description": "Path of {skill_package}/context-snippet.md." },
156
+ "metadata": { "type": "string", "minLength": 1, "description": "Path of {skill_package}/metadata.json." },
157
+ "references": { "type": "string", "minLength": 1, "description": "Path of the {skill_package}/references/ folder." },
158
+ "provenance_map": { "type": "string", "minLength": 1, "description": "Path of {forge_version}/provenance-map.json." },
159
+ "evidence_report": {
160
+ "type": "string",
161
+ "minLength": 1,
162
+ "description": "Path of {forge_version}/evidence-report.md, which holds the Auto-Decisions table."
163
+ },
164
+ "extraction_rules": { "type": "string", "minLength": 1, "description": "Path of {forge_version}/extraction-rules.yaml." }
165
+ },
166
+ "description": "The files the brief's run wrote, by kind. Empty at a HARD HALT before step 7 promoted the package; a later halt lists what is on disk."
167
+ },
168
+ "summary": {
169
+ "type": "object",
170
+ "default": {},
171
+ "additionalProperties": false,
172
+ "properties": {
173
+ "skill_name": { "type": "string", "minLength": 1, "description": "The brief's name, the skill's folder name." },
174
+ "version": { "type": "string", "minLength": 1, "description": "The version folder the run wrote." },
175
+ "forge_tier": {
176
+ "type": "string",
177
+ "enum": ["Quick", "Forge", "Forge+", "Deep"],
178
+ "description": "The tier the run compiled at, after any tier_override."
179
+ },
180
+ "exports_documented": { "type": "integer", "minimum": 0, "description": "metadata.json stats.exports_documented." },
181
+ "confidence_distribution": {
182
+ "type": "object",
183
+ "additionalProperties": false,
184
+ "required": ["t1", "t1_low", "t2", "t3"],
185
+ "properties": {
186
+ "t1": { "type": "integer", "minimum": 0 },
187
+ "t1_low": { "type": "integer", "minimum": 0 },
188
+ "t2": { "type": "integer", "minimum": 0 },
189
+ "t3": { "type": "integer", "minimum": 0 }
190
+ },
191
+ "description": "metadata.json confidence_distribution, as skf-render-metadata-stats.py computed it."
192
+ },
193
+ "auto_decision_count": {
194
+ "type": "integer",
195
+ "minimum": 0,
196
+ "description": "The decisions the run took without asking, as recorded in its run folder: every gate a headless run resolved by its default, and step 1's tier override in any mode. The rows of the evidence report's Auto-Decisions table; 0 when there were none."
197
+ },
198
+ "warning": {
199
+ "type": "string",
200
+ "enum": ["zero-exports"],
201
+ "description": "Set with status 'partial': a source brief's extraction found no export and the run went on."
202
+ },
203
+ "halt_reason": {
204
+ "type": "string",
205
+ "minLength": 1,
206
+ "description": "At a HARD HALT, the halt_reason again, where the halt line carried it before the envelope had a schema."
207
+ },
208
+ "evidence_report": {
209
+ "type": ["string", "null"],
210
+ "description": "At a HARD HALT, {forge_version}/evidence-report.md once step 7 promoted it, else null."
211
+ }
212
+ },
213
+ "description": "On a finished run, the facts a pipeline branches on. At a HARD HALT, halt_reason and evidence_report."
214
+ },
215
+ "skill_package": {
216
+ "type": ["string", "null"],
217
+ "description": "Absolute path of {skill_package} once step 7 promoted it; null before, and at the step 7 ownership halts (the refused folder is in error.path)."
218
+ },
219
+ "timestamp": {
220
+ "type": "string",
221
+ "minLength": 1,
222
+ "description": "ISO-8601 UTC time the emitter stamped from the clock."
223
+ },
224
+ "run_id": {
225
+ "type": ["string", "null"],
226
+ "description": "The brief's run folder id, stamped by the emitter (each brief of a --batch run has its own); null for a halt before the run folder exists."
227
+ },
228
+ "result_path": {
229
+ "type": ["string", "null"],
230
+ "description": "The per-run create-skill-result-<YYYYMMDD-HHmmss>.json this envelope's call wrote in {forge_version}, beside its -latest copy, or null when it wrote none (every halt before step 7 created {forge_version})."
231
+ },
232
+ "headless_decisions": {
233
+ "type": "array",
234
+ "items": {
235
+ "type": "object",
236
+ "additionalProperties": false,
237
+ "required": ["step", "gate", "decision", "rationale", "timestamp"],
238
+ "properties": {
239
+ "step": {
240
+ "type": "string",
241
+ "minLength": 1,
242
+ "description": "The step whose gate decided: load-brief, extract, component-extraction or compile."
243
+ },
244
+ "gate": {
245
+ "type": "string",
246
+ "minLength": 1,
247
+ "description": "The gate: tier-override, tag-choice, review-gate, zero-exports, demo-exclusion, registry-confirm, provide-or-skip-registry, manual-carry-forward (compile kept an earlier build's hand-written [MANUAL] content), or authoritative-file:<path> (one decision per authoritative file a headless run deferred)."
248
+ },
249
+ "decision": {
250
+ "type": "string",
251
+ "minLength": 1,
252
+ "description": "The action the run took, such as 'C', 'Y', 'S', 'apply' or 'deferred-headless'."
253
+ },
254
+ "value": {
255
+ "type": "string",
256
+ "minLength": 1,
257
+ "description": "Optional: the value the decision applied, such as the tier_override or the tag chosen."
258
+ },
259
+ "fallback": {
260
+ "type": "string",
261
+ "minLength": 1,
262
+ "description": "Optional: what the run used instead, such as the detected tier when an override was rejected."
263
+ },
264
+ "rationale": {
265
+ "type": "string",
266
+ "minLength": 1,
267
+ "description": "Why, for example 'headless mode: no human to confirm scope or ref'."
268
+ },
269
+ "timestamp": {
270
+ "type": "string",
271
+ "minLength": 1,
272
+ "description": "ISO-8601 time the gate decided."
273
+ }
274
+ }
275
+ },
276
+ "description": "One entry per decision the run took without asking, recorded in the run folder's sink the moment its gate decided: every gate a headless run resolved by its default, and step 1's tier override in any mode. The evidence report's Auto-Decisions table renders the same entries. Empty when there were none."
277
+ },
278
+ "warnings": {
279
+ "type": "array",
280
+ "items": { "type": "string", "minLength": 1 },
281
+ "description": "Non-fatal anomalies the run recorded in its run folder, one string each, such as customization_resolver_unavailable. Empty when none."
282
+ }
283
+ }
284
+ }
@@ -0,0 +1,164 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/armelhbobdad/bmad-module-skill-forge/src/shared/scripts/schemas/skf-drop-skill-result-envelope.v1.json",
4
+ "title": "SKF_DROP_SKILL_RESULT_JSON envelope (v1)",
5
+ "description": "Single-line JSON document skf-drop-skill emits when {headless_mode} is true, prefixed with the literal 'SKF_DROP_SKILL_RESULT_JSON: ': on stdout when step 3 reports a finished drop, on stdout when a --dry-run stops at the step 1 confirmation gate, and on stderr at every HARD HALT. The shared emitter builds each line from the payload a stage gives it, so pipelines branch on status and halt_reason without parsing the human-readable report. src/skf-drop-skill/references/invocation-contract.md describes each field.",
6
+ "$defs": {
7
+ "skf-envelope": {
8
+ "description": "The shared emitter's settings for this workflow, read by skf-emit-result-envelope.py: the workflow, the line's prefix, the status a halt carries, the exit code of each halt_reason and the result file stem. Nothing in the schema references this entry, so it constrains no envelope.",
9
+ "const": {
10
+ "workflow": "skf-drop-skill",
11
+ "prefix": "SKF_DROP_SKILL_RESULT_JSON",
12
+ "wrapper": null,
13
+ "halt_status": "error",
14
+ "exit_codes": {
15
+ "input-missing": 2,
16
+ "input-invalid": 2,
17
+ "manifest-corrupt": 3,
18
+ "nothing-to-drop": 3,
19
+ "manifest-write-failed": 4,
20
+ "context-rebuild-failed": 4,
21
+ "delete-failed": 4,
22
+ "write-failed": 4,
23
+ "active-version-guard-refused": 5,
24
+ "not-skf-output": 5,
25
+ "headless-purge-forbidden": 6,
26
+ "user-cancelled": 6
27
+ },
28
+ "success_exit_code": 0,
29
+ "result_file": "drop-skill-result"
30
+ }
31
+ }
32
+ },
33
+ "type": "object",
34
+ "additionalProperties": false,
35
+ "required": [
36
+ "status",
37
+ "skill",
38
+ "drop_mode",
39
+ "versions_affected",
40
+ "files_deleted",
41
+ "would_delete",
42
+ "forge_left_in_place",
43
+ "manifest_updated",
44
+ "result_path",
45
+ "exit_code",
46
+ "halt_reason",
47
+ "error"
48
+ ],
49
+ "properties": {
50
+ "status": {
51
+ "type": "string",
52
+ "enum": ["success", "error", "dry-run"],
53
+ "description": "'success' when step 3 reports a finished drop (also when some purge folders could not be deleted: the result file's own status says 'partial' then). 'dry-run' when --dry-run stopped at the step 1 confirmation gate before any change. 'error' at every HARD HALT."
54
+ },
55
+ "skill": {
56
+ "type": ["string", "null"],
57
+ "minLength": 1,
58
+ "description": "The skill the run selected. Null when the run halted before one was selected."
59
+ },
60
+ "drop_mode": {
61
+ "type": ["string", "null"],
62
+ "enum": ["deprecate", "purge", null],
63
+ "default": null,
64
+ "description": "'deprecate' (manifest only, files kept) or 'purge' (files deleted too). Null when the run halted before the mode was decided."
65
+ },
66
+ "versions_affected": {
67
+ "oneOf": [
68
+ {
69
+ "type": "array",
70
+ "items": { "type": "string", "minLength": 1 }
71
+ },
72
+ {
73
+ "type": "string",
74
+ "enum": ["all"]
75
+ }
76
+ ],
77
+ "default": [],
78
+ "description": "The versions the drop covers: a list holding the one version dropped, or 'all' for a drop of the whole skill. An empty list when the run halted before the scope was chosen."
79
+ },
80
+ "files_deleted": {
81
+ "type": "array",
82
+ "items": { "type": "string", "minLength": 1 },
83
+ "default": [],
84
+ "description": "The absolute folder paths a purge deleted. Empty for a deprecate, a dry run and a HALT (a purge that deleted nothing halts with delete-failed)."
85
+ },
86
+ "would_delete": {
87
+ "type": "array",
88
+ "items": { "type": "string", "minLength": 1 },
89
+ "default": [],
90
+ "description": "Dry run of a purge only: the absolute folder paths the purge would delete (the purge check's affected_directories), so a pipeline can check the blast radius before it runs the drop. Empty otherwise, and for a dry run in deprecate mode."
91
+ },
92
+ "forge_left_in_place": {
93
+ "type": ["string", "null"],
94
+ "minLength": 1,
95
+ "default": null,
96
+ "description": "The forge folder a purge leaves in place (or, in a dry run, would leave) because SKF did not generate it. Null otherwise, and in deprecate mode."
97
+ },
98
+ "manifest_updated": {
99
+ "type": "boolean",
100
+ "default": false,
101
+ "description": "True when step 2 wrote the export manifest. False for a draft skill (it has no manifest entry), a dry run and a HALT before the write; a failed manifest write halts with manifest-write-failed."
102
+ },
103
+ "result_path": {
104
+ "type": ["string", "null"],
105
+ "description": "The per-run result file the emitter wrote for a finished drop, {skills_output_folder}/drop-skill-result-<YYYYMMDD-HHmmss>.json (UTC), beside its drop-skill-result-latest.json copy. Stamped by the emitter, never typed. Null for a dry run and a HALT, which write no result file, and when the write failed (warnings say why)."
106
+ },
107
+ "exit_code": {
108
+ "type": "integer",
109
+ "enum": [0, 2, 3, 4, 5, 6],
110
+ "description": "Process exit code matching the Exit Codes table in src/skf-drop-skill/references/invocation-contract.md, derived from halt_reason: null gives 0, input-missing and input-invalid 2, manifest-corrupt and nothing-to-drop 3, manifest-write-failed, context-rebuild-failed, delete-failed and write-failed 4, active-version-guard-refused and not-skf-output 5, headless-purge-forbidden and user-cancelled 6."
111
+ },
112
+ "halt_reason": {
113
+ "type": ["string", "null"],
114
+ "enum": [
115
+ null,
116
+ "input-missing",
117
+ "input-invalid",
118
+ "manifest-corrupt",
119
+ "nothing-to-drop",
120
+ "manifest-write-failed",
121
+ "context-rebuild-failed",
122
+ "delete-failed",
123
+ "write-failed",
124
+ "active-version-guard-refused",
125
+ "not-skf-output",
126
+ "headless-purge-forbidden",
127
+ "user-cancelled"
128
+ ],
129
+ "description": "Null on success and on a dry run. One of the documented HALT classes on error, so a pipeline surfaces the right operator message without parsing the prose."
130
+ },
131
+ "error": {
132
+ "oneOf": [
133
+ { "type": "null" },
134
+ {
135
+ "type": "object",
136
+ "additionalProperties": false,
137
+ "required": ["phase", "reason"],
138
+ "properties": {
139
+ "phase": {
140
+ "type": "string",
141
+ "minLength": 1,
142
+ "description": "The step and gate that halted, such as 'select:scope' or 'execute:manifest-write'."
143
+ },
144
+ "reason": {
145
+ "type": "string",
146
+ "minLength": 1,
147
+ "description": "The halt's one-line message."
148
+ },
149
+ "path": {
150
+ "type": "string",
151
+ "description": "The file or folder the failed operation targeted, when the halt names one."
152
+ }
153
+ }
154
+ }
155
+ ],
156
+ "description": "Null on success and on a dry run. On a HALT, the step that halted and its message."
157
+ },
158
+ "warnings": {
159
+ "type": "array",
160
+ "items": { "type": "string", "minLength": 1 },
161
+ "description": "Optional. Non-fatal anomalies the run recorded, one string each, such as result_file_write_failed when the result file could not be written. Present only when there is at least one."
162
+ }
163
+ }
164
+ }
@@ -0,0 +1,160 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/armelhbobdad/bmad-module-skill-forge/src/shared/scripts/schemas/skf-export-result-envelope.v1.json",
4
+ "title": "SKF_EXPORT_RESULT_JSON envelope (v1)",
5
+ "description": "Single-line JSON document skf-export-skill emits when {headless_mode} is true, prefixed with the literal 'SKF_EXPORT_RESULT_JSON: ': once on stdout when a run ends (step 6, summary, with status success or dry-run) and once on stderr at every HARD HALT (status error). The shared emitter, skf-emit-result-envelope.py, builds every line from the payload the run passes it, folds in the auto-decisions the run's gates recorded in its run sink, derives exit_code from halt_reason and checks the line against this schema, so the model never types it. The skill's references/result-envelope.md holds the halt command and the Exit Codes table that maps each halt site to its code.",
6
+ "$defs": {
7
+ "skf-envelope": {
8
+ "description": "The shared emitter's settings for this workflow, read by skf-emit-result-envelope.py: the workflow, the line's prefix, the wrapper, the status a halt carries, the exit code of each halt_reason and the result file stem. Nothing in the schema references this entry, so it constrains no envelope.",
9
+ "const": {
10
+ "workflow": "skf-export-skill",
11
+ "prefix": "SKF_EXPORT_RESULT_JSON",
12
+ "wrapper": null,
13
+ "halt_status": "error",
14
+ "exit_codes": {
15
+ "input-missing": 2,
16
+ "resolution-failure": 3,
17
+ "not-skf-output": 3,
18
+ "write-failed": 4,
19
+ "context-rebuild-failed": 4,
20
+ "manifest-write-failed": 4,
21
+ "malformed-markers": 5,
22
+ "user-cancelled": 6
23
+ },
24
+ "success_exit_code": 0,
25
+ "result_file": "export-skill-result"
26
+ }
27
+ }
28
+ },
29
+ "type": "object",
30
+ "additionalProperties": false,
31
+ "required": [
32
+ "status",
33
+ "skills",
34
+ "context_files_updated",
35
+ "manifest_path",
36
+ "headless_decisions",
37
+ "exit_code",
38
+ "halt_reason",
39
+ "result_path"
40
+ ],
41
+ "properties": {
42
+ "status": {
43
+ "type": "string",
44
+ "enum": ["success", "dry-run", "error"],
45
+ "description": "'success' when the run reached the terminal step and recorded every skill of the batch in the export manifest (with passive context on, it also wrote the context files and the snippets). 'dry-run' when --dry-run previewed the run and wrote none of them (no result file either). 'error' on any HARD HALT."
46
+ },
47
+ "skills": {
48
+ "type": "array",
49
+ "items": { "type": "string", "minLength": 1 },
50
+ "uniqueItems": true,
51
+ "description": "The skill names of the run's batch. Empty when a halt came before step 1 resolved the batch."
52
+ },
53
+ "context_files_updated": {
54
+ "type": "array",
55
+ "items": { "type": "string", "minLength": 1 },
56
+ "uniqueItems": true,
57
+ "description": "The context files (CLAUDE.md, AGENTS.md, .cursorrules) whose managed section this run wrote and verified. Empty on a dry run, with passive context off, and when a halt came before any write."
58
+ },
59
+ "manifest_path": {
60
+ "type": ["string", "null"],
61
+ "minLength": 1,
62
+ "description": "The export manifest path once step 4 recorded every skill of the batch in it. Null when no manifest write completed: every dry run, and every halt before the manifest write finished."
63
+ },
64
+ "headless_decisions": {
65
+ "type": "array",
66
+ "items": {
67
+ "type": "object",
68
+ "additionalProperties": false,
69
+ "required": ["gate", "default_action", "taken_action", "reason"],
70
+ "properties": {
71
+ "gate": {
72
+ "type": "string",
73
+ "enum": [
74
+ "load-skill.snippet-root-layout",
75
+ "load-skill.snippet-root-probe",
76
+ "load-skill.confirmation",
77
+ "update-context.orphan-context-files",
78
+ "update-context.orphan-rows",
79
+ "update-context.write-confirmation"
80
+ ],
81
+ "description": "The gate that auto-resolved: step 1's snippet-root layout question (no earlier export chose a root), snippet-root mismatch gate (an earlier export's root differs from the IDE mapping, resolved by the folder on disk that holds the skills) and confirmation gate, and step 4's orphaned context files gate, orphaned managed-section rows gate and write confirmation gate. Each gate records its decision in the run sink the moment it decides."
82
+ },
83
+ "default_action": {
84
+ "type": "string",
85
+ "minLength": 1,
86
+ "description": "The action documented as the gate's default (for example 'C' for [C] Continue, 'b' for option (b))."
87
+ },
88
+ "taken_action": {
89
+ "type": "string",
90
+ "minLength": 1,
91
+ "description": "The action the run took. In a headless run it equals default_action."
92
+ },
93
+ "reason": {
94
+ "type": "string",
95
+ "minLength": 1,
96
+ "description": "Human-readable rationale, such as 'headless: auto-continue past skill confirmation'."
97
+ },
98
+ "evidence": {
99
+ "type": "object",
100
+ "additionalProperties": true,
101
+ "description": "Optional gate-specific data: the observed snippet-root prefixes, the orphaned context files, or the orphaned rows' skills."
102
+ }
103
+ }
104
+ },
105
+ "description": "One entry per gate that auto-resolved during the run, read from the run sink, so a halt reports the decisions taken before it. Empty in an interactive run."
106
+ },
107
+ "exit_code": {
108
+ "type": "integer",
109
+ "enum": [0, 2, 3, 4, 5, 6],
110
+ "description": "Process exit code matching the Exit Codes table of the skill's references/result-envelope.md, derived from halt_reason: null gives 0, input-missing 2, resolution-failure and not-skf-output 3, write-failed, context-rebuild-failed and manifest-write-failed 4, malformed-markers 5, user-cancelled 6."
111
+ },
112
+ "halt_reason": {
113
+ "type": ["string", "null"],
114
+ "enum": [
115
+ null,
116
+ "input-missing",
117
+ "resolution-failure",
118
+ "not-skf-output",
119
+ "write-failed",
120
+ "context-rebuild-failed",
121
+ "manifest-write-failed",
122
+ "malformed-markers",
123
+ "user-cancelled"
124
+ ],
125
+ "description": "Null on success and dry-run. One of the documented HALT classes on error, so pipelines branch on the failure class without grepping the prose message."
126
+ },
127
+ "result_path": {
128
+ "type": ["string", "null"],
129
+ "minLength": 1,
130
+ "description": "The per-run result file the emitter wrote in the skills output folder, export-skill-result-<YYYYMMDD-HHmmss>.json (its copy is export-skill-result-latest.json beside it). Null on a dry run, on every halt, and when the write failed (a result_file_write_failed warning says why)."
131
+ },
132
+ "warnings": {
133
+ "type": "array",
134
+ "items": { "type": "string", "minLength": 1 },
135
+ "description": "Optional. Non-fatal anomalies the run recorded in its sink or the emitter raised, one string each (for example result_file_write_failed). Present only when there is at least one."
136
+ },
137
+ "error": {
138
+ "type": "object",
139
+ "additionalProperties": false,
140
+ "required": ["phase", "reason"],
141
+ "properties": {
142
+ "phase": {
143
+ "type": "string",
144
+ "minLength": 1,
145
+ "description": "Where the run halted: the step file and section, for example 'update-context §9'."
146
+ },
147
+ "reason": {
148
+ "type": "string",
149
+ "minLength": 1,
150
+ "description": "The halt message the step displayed, on one line."
151
+ },
152
+ "path": {
153
+ "type": "string",
154
+ "description": "Optional path the failed operation targeted."
155
+ }
156
+ },
157
+ "description": "Present on a HARD HALT only: where the run stopped and why. Pipelines branch on halt_reason and read error for the diagnostic."
158
+ }
159
+ }
160
+ }