bmad-module-skill-forge 2.2.0 → 4.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/README.md +49 -49
- package/docs/404.md +10 -8
- package/docs/_data/pinned.yaml +22 -13
- package/docs/_internal/STABILITY.md +58 -35
- package/docs/agents.md +39 -53
- package/docs/architecture.md +65 -51
- package/docs/bmad-synergy.md +53 -51
- package/docs/campaign.md +127 -75
- package/docs/concepts.md +34 -28
- package/docs/examples.md +70 -68
- package/docs/forge-auto.md +34 -31
- package/docs/getting-started.md +118 -57
- package/docs/how-it-works.md +25 -21
- package/docs/index.md +15 -15
- package/docs/skill-model.md +70 -59
- package/docs/troubleshooting.md +143 -18
- package/docs/verifying-a-skill.md +87 -57
- package/docs/why-skf.md +24 -22
- package/docs/workflows.md +274 -110
- package/package.json +18 -10
- package/src/forger/preferences.yaml +8 -1
- package/src/knowledge/agentskills-spec.md +2 -0
- package/src/knowledge/ccc-bridge.md +40 -24
- package/src/knowledge/confidence-tiers.md +9 -5
- package/src/knowledge/overview.md +3 -3
- package/src/knowledge/progressive-capability.md +8 -8
- package/src/knowledge/provenance-tracking.md +9 -5
- package/src/knowledge/qmd-registry.md +3 -3
- package/src/knowledge/skf-knowledge-index.csv +2 -2
- package/src/knowledge/skill-lifecycle.md +18 -11
- package/src/knowledge/split-body-strategy.md +0 -3
- package/src/knowledge/tool-resolution.md +4 -2
- package/src/knowledge/version-paths.md +101 -15
- package/src/module-help.csv +3 -3
- package/src/module.yaml +10 -0
- package/src/shared/data/ast-grep-recipes.yaml +608 -0
- package/src/shared/data/ide-context-files.json +30 -0
- package/src/shared/health-check.md +31 -59
- package/src/shared/references/description-guard-protocol.md +12 -9
- package/src/shared/references/feasibility-report-schema.md +19 -13
- package/src/shared/references/headless-gate-convention.md +55 -3
- package/src/shared/references/output-contract-schema.md +19 -8
- package/src/shared/references/pipeline-contracts.md +94 -29
- package/src/shared/references/tessl-review.md +77 -0
- package/src/shared/scripts/schemas/skf-analyze-result-envelope.v1.json +194 -0
- package/src/shared/scripts/schemas/skf-audit-result-envelope.v1.json +192 -0
- package/src/shared/scripts/schemas/skf-brief-result-envelope.v1.json +32 -4
- package/src/shared/scripts/schemas/skf-campaign-result-envelope.v1.json +174 -0
- package/src/shared/scripts/schemas/skf-create-skill-result-envelope.v1.json +284 -0
- package/src/shared/scripts/schemas/skf-drop-skill-result-envelope.v1.json +164 -0
- package/src/shared/scripts/schemas/skf-export-result-envelope.v1.json +160 -0
- package/src/shared/scripts/schemas/skf-quick-skill-result-envelope.v1.json +261 -0
- package/src/shared/scripts/schemas/skf-refine-architecture-result-envelope.v1.json +192 -0
- package/src/shared/scripts/schemas/skf-rename-skill-result-envelope.v1.json +179 -0
- package/src/shared/scripts/schemas/skf-setup-result-envelope.v1.json +27 -11
- package/src/shared/scripts/schemas/skf-stack-result-envelope.v1.json +176 -0
- package/src/shared/scripts/schemas/skf-test-result-envelope.v1.json +173 -0
- package/src/shared/scripts/schemas/skf-update-result-envelope.v1.json +19 -5
- package/src/shared/scripts/schemas/skf-verify-stack-result-envelope.v1.json +180 -0
- package/src/shared/scripts/schemas/skill-brief.v1.json +34 -0
- package/src/shared/scripts/schemas/workspace-detection.v1.json +1 -1
- package/src/shared/scripts/skf-atomic-write.py +233 -64
- package/src/shared/scripts/skf-build-change-manifest.py +2753 -28
- package/src/shared/scripts/skf-ccc-git-hygiene.py +532 -0
- package/src/shared/scripts/skf-check-unit-records.py +184 -0
- package/src/shared/scripts/skf-check-workspace-drift.py +538 -9
- package/src/shared/scripts/skf-classify-changed-files.py +772 -0
- package/src/shared/scripts/skf-comention-pairs.py +1333 -123
- package/src/shared/scripts/skf-compare-file-hashes.py +267 -105
- package/src/shared/scripts/skf-count-imports.py +1867 -0
- package/src/shared/scripts/skf-count-tokens.py +1 -1
- package/src/shared/scripts/skf-derive-assembly-shape.py +21 -3
- package/src/shared/scripts/skf-description-guard.py +99 -11
- package/src/shared/scripts/skf-detect-docs.py +694 -2
- package/src/shared/scripts/skf-detect-language.py +486 -107
- package/src/shared/scripts/skf-detect-registry.py +887 -0
- package/src/shared/scripts/skf-detect-scripts-assets.py +197 -55
- package/src/shared/scripts/skf-detect-tools.py +209 -27
- package/src/shared/scripts/skf-detect-workspaces.py +506 -30
- package/src/shared/scripts/skf-disqualify-candidates.py +821 -182
- package/src/shared/scripts/skf-emit-brief-result-envelope.py +69 -191
- package/src/shared/scripts/skf-emit-result-envelope.py +1604 -106
- package/src/shared/scripts/skf-enumerate-stack-skills.py +986 -117
- package/src/shared/scripts/skf-extract-public-api.py +5247 -96
- package/src/shared/scripts/skf-extraction-inventory.py +1280 -0
- package/src/shared/scripts/skf-extraction-snapshot.py +664 -0
- package/src/shared/scripts/skf-fetch-temporal.py +674 -0
- package/src/shared/scripts/skf-find-cycles.py +97 -29
- package/src/shared/scripts/skf-find-test-report.py +476 -0
- package/src/shared/scripts/skf-forge-tier-rw.py +469 -205
- package/src/shared/scripts/skf-github-fetch.py +365 -0
- package/src/shared/scripts/skf-github-probe.py +700 -0
- package/src/shared/scripts/skf-hash-content.py +180 -20
- package/src/shared/scripts/skf-language-corpora.py +1 -1
- package/src/shared/scripts/skf-load-provenance.py +161 -27
- package/src/shared/scripts/skf-manifest-ops.py +1 -1
- package/src/shared/scripts/skf-merge-ccc-exclusions.py +2307 -223
- package/src/shared/scripts/skf-merge-doc-urls.py +143 -20
- package/src/shared/scripts/skf-names-present.py +221 -0
- package/src/shared/scripts/skf-pair-intersect.py +119 -28
- package/src/shared/scripts/skf-parse-gaps.py +1384 -0
- package/src/shared/scripts/skf-preapply.py +1 -1
- package/src/shared/scripts/skf-preflight.py +176 -28
- package/src/shared/scripts/skf-promote-staged.py +430 -0
- package/src/shared/scripts/skf-provenance-gap-dispatch.py +64 -8
- package/src/shared/scripts/skf-qmd-classify-collections.py +229 -45
- package/src/shared/scripts/skf-quick-batch.py +774 -0
- package/src/shared/scripts/skf-rebuild-managed-sections.py +972 -88
- package/src/shared/scripts/skf-recommend-scope-type.py +323 -156
- package/src/shared/scripts/skf-render-metadata-stats.py +156 -12
- package/src/shared/scripts/skf-render-quick-metadata.py +132 -28
- package/src/shared/scripts/skf-render-stack-metadata.py +976 -0
- package/src/shared/scripts/skf-resolve-authoritative-files.py +155 -14
- package/src/shared/scripts/skf-resolve-package.py +523 -106
- package/src/shared/scripts/skf-rewrite-skill-name.py +433 -47
- package/src/shared/scripts/skf-run-lock.py +577 -0
- package/src/shared/scripts/skf-scan-manifests.py +998 -57
- package/src/shared/scripts/skf-scan-skill-md-structure.py +1341 -37
- package/src/shared/scripts/skf-severity-classify.py +712 -108
- package/src/shared/scripts/skf-shape-detect.py +298 -204
- package/src/shared/scripts/skf-shard-body.py +9 -8
- package/src/shared/scripts/skf-skill-inventory.py +2412 -89
- package/src/shared/scripts/skf-skills-module.py +472 -0
- package/src/shared/scripts/skf-source-tree.py +1796 -0
- package/src/shared/scripts/skf-structural-diff.py +787 -121
- package/src/shared/scripts/skf-tessl-review.py +706 -0
- package/src/shared/scripts/skf-update-active-symlink.py +120 -67
- package/src/shared/scripts/skf-update-run-state.py +624 -0
- package/src/shared/scripts/skf-validate-brief-inputs.py +92 -29
- package/src/shared/scripts/skf-validate-brief-schema.py +23 -2
- package/src/shared/scripts/skf-validate-feasibility-report.py +577 -66
- package/src/shared/scripts/skf-validate-frontmatter.py +103 -26
- package/src/shared/scripts/skf-validate-output.py +712 -64
- package/src/shared/scripts/skf-validate-pins.py +1 -1
- package/src/shared/scripts/skf-verify-no-trace.py +116 -10
- package/src/shared/scripts/skf-verify-provenance-completeness.py +3945 -152
- package/src/shared/scripts/skf-write-skill-brief.py +406 -25
- package/src/shared/tool-requirements.yaml +201 -0
- package/src/skf-analyze-source/SKILL.md +41 -36
- package/src/skf-analyze-source/assets/skill-brief-schema.md +7 -8
- package/src/skf-analyze-source/customize.toml +36 -24
- package/src/skf-analyze-source/references/auto-docs-only.md +58 -20
- package/src/skf-analyze-source/references/continue.md +2 -13
- package/src/skf-analyze-source/references/discover-additional-source.md +147 -0
- package/src/skf-analyze-source/references/generate-briefs.md +121 -55
- package/src/skf-analyze-source/references/headless-contract.md +42 -15
- package/src/skf-analyze-source/references/identify-units.md +96 -110
- package/src/skf-analyze-source/references/init.md +73 -71
- package/src/skf-analyze-source/references/map-and-detect.md +123 -105
- package/src/skf-analyze-source/references/map-unit-exports.md +68 -0
- package/src/skf-analyze-source/references/recommend.md +51 -70
- package/src/skf-analyze-source/references/scan-project.md +60 -84
- package/src/skf-analyze-source/references/scan-root.md +39 -0
- package/src/skf-analyze-source/references/step-auto-scope-coexistence.md +47 -0
- package/src/skf-analyze-source/references/step-auto-scope-corpora.md +53 -0
- package/src/skf-analyze-source/references/step-auto-scope-split.md +91 -0
- package/src/skf-analyze-source/references/step-auto-scope.md +208 -293
- package/src/skf-analyze-source/references/step-shape-detect.md +14 -12
- package/src/skf-analyze-source/references/unit-detection-heuristics.md +37 -42
- package/src/skf-audit-skill/SKILL.md +43 -51
- package/src/skf-audit-skill/assets/drift-report-template.md +28 -3
- package/src/skf-audit-skill/customize.toml +41 -20
- package/src/skf-audit-skill/references/constituent-freshness.md +91 -0
- package/src/skf-audit-skill/references/doc-drift.md +141 -0
- package/src/skf-audit-skill/references/headless-contract.md +29 -0
- package/src/skf-audit-skill/references/health-check.md +2 -0
- package/src/skf-audit-skill/references/init.md +149 -210
- package/src/skf-audit-skill/references/re-index.md +103 -110
- package/src/skf-audit-skill/references/report.md +96 -33
- package/src/skf-audit-skill/references/semantic-diff.md +34 -25
- package/src/skf-audit-skill/references/severity-classify.md +79 -65
- package/src/skf-audit-skill/references/severity-rules.md +15 -6
- package/src/skf-audit-skill/references/structural-diff.md +80 -90
- package/src/skf-audit-skill/references/upstream-checkout.md +77 -0
- package/src/skf-audit-skill/scripts/render-drift-tables.py +712 -0
- package/src/skf-brief-skill/SKILL.md +37 -26
- package/src/skf-brief-skill/assets/description-voice-examples.md +1 -1
- package/src/skf-brief-skill/assets/scope-templates.md +18 -25
- package/src/skf-brief-skill/assets/skill-brief-schema.md +30 -23
- package/src/skf-brief-skill/customize.toml +48 -20
- package/src/skf-brief-skill/references/analyze-target.md +144 -127
- package/src/skf-brief-skill/references/confirm-brief.md +11 -9
- package/src/skf-brief-skill/references/draft-checkpoint.md +36 -17
- package/src/skf-brief-skill/references/gather-intent-ratify.md +68 -0
- package/src/skf-brief-skill/references/gather-intent.md +87 -182
- package/src/skf-brief-skill/references/headless-args.md +84 -16
- package/src/skf-brief-skill/references/health-check.md +1 -1
- package/src/skf-brief-skill/references/invocation-contract.md +18 -13
- package/src/skf-brief-skill/references/portfolio-similarity-check.md +1 -1
- package/src/skf-brief-skill/references/qmd-collection-registration.md +7 -10
- package/src/skf-brief-skill/references/scope-definition.md +123 -47
- package/src/skf-brief-skill/references/step-auto-brief.md +26 -100
- package/src/skf-brief-skill/references/step-auto-validate.md +20 -121
- package/src/skf-brief-skill/references/version-resolution.md +7 -10
- package/src/skf-brief-skill/references/write-brief.md +66 -57
- package/src/skf-campaign/SKILL.md +31 -34
- package/src/skf-campaign/assets/campaign-state-schema.json +25 -4
- package/src/skf-campaign/customize.toml +47 -16
- package/src/skf-campaign/references/campaign-contracts.md +39 -29
- package/src/skf-campaign/references/campaign-directive-spec.md +4 -2
- package/src/skf-campaign/references/health-check.md +7 -16
- package/src/skf-campaign/references/step-01-setup.md +46 -84
- package/src/skf-campaign/references/step-02-strategy.md +31 -30
- package/src/skf-campaign/references/step-03-pins.md +26 -18
- package/src/skf-campaign/references/step-04-provenance.md +24 -23
- package/src/skf-campaign/references/step-05-skill-loop.md +67 -48
- package/src/skf-campaign/references/step-06-batch.md +41 -34
- package/src/skf-campaign/references/step-07-capstone.md +40 -25
- package/src/skf-campaign/references/step-08-verify.md +28 -29
- package/src/skf-campaign/references/step-09-refine.md +29 -30
- package/src/skf-campaign/references/step-10-export.md +48 -36
- package/src/skf-campaign/references/step-11-maintenance.md +31 -34
- package/src/skf-campaign/references/step-resume.md +37 -68
- package/src/skf-campaign/scripts/campaign-deps.py +57 -18
- package/src/skf-campaign/scripts/campaign-parse-manifest.py +361 -54
- package/src/skf-campaign/scripts/campaign-provenance.py +96 -53
- package/src/skf-campaign/scripts/campaign-quality-gate.py +592 -0
- package/src/skf-campaign/scripts/campaign-render-batch.py +257 -49
- package/src/skf-campaign/scripts/campaign-render-kickoff.py +343 -50
- package/src/skf-campaign/scripts/campaign-report.py +204 -37
- package/src/skf-campaign/scripts/campaign-state.py +1128 -0
- package/src/skf-campaign/scripts/campaign-status.py +10 -74
- package/src/skf-campaign/scripts/campaign-validate-pins.py +30 -3
- package/src/skf-campaign/scripts/campaign-validate-state.py +34 -4
- package/src/skf-campaign/templates/campaign-brief-template.yaml +4 -5
- package/src/skf-campaign/templates/campaign-report-template.md +5 -1
- package/src/skf-campaign/templates/kickoff-template.md +0 -14
- package/src/skf-create-skill/SKILL.md +27 -20
- package/src/skf-create-skill/assets/compile-assembly-rules.md +11 -8
- package/src/skf-create-skill/assets/skill-sections.md +21 -11
- package/src/skf-create-skill/customize.toml +20 -8
- package/src/skf-create-skill/references/authoritative-files-protocol.md +36 -58
- package/src/skf-create-skill/references/batch-mode.md +81 -0
- package/src/skf-create-skill/references/ccc-index-check.md +27 -0
- package/src/skf-create-skill/references/compile.md +119 -70
- package/src/skf-create-skill/references/component-extraction.md +113 -91
- package/src/skf-create-skill/references/enrich.md +41 -23
- package/src/skf-create-skill/references/entry-points-by-hand.md +37 -0
- package/src/skf-create-skill/references/extract.md +204 -162
- package/src/skf-create-skill/references/extraction-patterns-by-hand.md +141 -0
- package/src/skf-create-skill/references/extraction-patterns-tracing.md +11 -11
- package/src/skf-create-skill/references/extraction-patterns.md +588 -201
- package/src/skf-create-skill/references/generate-artifacts.md +145 -93
- package/src/skf-create-skill/references/health-check.md +1 -1
- package/src/skf-create-skill/references/load-brief.md +53 -36
- package/src/skf-create-skill/references/relabel-rule.md +12 -0
- package/src/skf-create-skill/references/report.md +37 -57
- package/src/skf-create-skill/references/source-resolution-protocols.md +58 -169
- package/src/skf-create-skill/references/step-auto-shard.md +20 -93
- package/src/skf-create-skill/references/step-doc-rot.md +44 -60
- package/src/skf-create-skill/references/step-doc-sources.md +28 -19
- package/src/skf-create-skill/references/sub/ccc-discover.md +18 -7
- package/src/skf-create-skill/references/sub/fetch-docs.md +106 -59
- package/src/skf-create-skill/references/sub/fetch-temporal.md +53 -166
- package/src/skf-create-skill/references/tier-degradation-rules.md +18 -9
- package/src/skf-create-skill/references/validate.md +173 -99
- package/src/skf-create-skill/scripts/scan-doc-rot.py +232 -99
- package/src/skf-create-stack-skill/SKILL.md +29 -56
- package/src/skf-create-stack-skill/assets/metadata-contract.md +51 -0
- package/src/skf-create-stack-skill/assets/provenance-map-schema.md +15 -15
- package/src/skf-create-stack-skill/assets/stack-skill-template.md +23 -57
- package/src/skf-create-stack-skill/customize.toml +23 -12
- package/src/skf-create-stack-skill/references/compile-stack.md +57 -66
- package/src/skf-create-stack-skill/references/compose-mode-rules.md +24 -44
- package/src/skf-create-stack-skill/references/detect-integrations.md +92 -95
- package/src/skf-create-stack-skill/references/detect-manifests.md +46 -71
- package/src/skf-create-stack-skill/references/generate-output.md +138 -128
- package/src/skf-create-stack-skill/references/init.md +90 -32
- package/src/skf-create-stack-skill/references/integration-patterns.md +1 -17
- package/src/skf-create-stack-skill/references/invocation-contract.md +34 -0
- package/src/skf-create-stack-skill/references/manifest-patterns.md +32 -20
- package/src/skf-create-stack-skill/references/parallel-extract.md +112 -38
- package/src/skf-create-stack-skill/references/rank-and-confirm.md +57 -75
- package/src/skf-create-stack-skill/references/report.md +39 -33
- package/src/skf-create-stack-skill/references/validate.md +20 -39
- package/src/skf-drop-skill/SKILL.md +28 -51
- package/src/skf-drop-skill/customize.toml +44 -30
- package/src/skf-drop-skill/references/execute.md +83 -146
- package/src/skf-drop-skill/references/health-check.md +2 -0
- package/src/skf-drop-skill/references/invocation-contract.md +64 -0
- package/src/skf-drop-skill/references/report.md +46 -30
- package/src/skf-drop-skill/references/select.md +122 -124
- package/src/skf-drop-skill/scripts/dir-sizes.py +54 -26
- package/src/skf-drop-skill/scripts/drop-roster.py +322 -0
- package/src/skf-export-skill/SKILL.md +40 -62
- package/src/skf-export-skill/assets/managed-section-format.md +14 -50
- package/src/skf-export-skill/assets/snippet-format.md +3 -1
- package/src/skf-export-skill/customize.toml +42 -13
- package/src/skf-export-skill/references/generate-snippet.md +54 -46
- package/src/skf-export-skill/references/health-check.md +2 -0
- package/src/skf-export-skill/references/invocation-contract.md +15 -0
- package/src/skf-export-skill/references/load-skill.md +88 -62
- package/src/skf-export-skill/references/manifest-rebuild.md +9 -10
- package/src/skf-export-skill/references/multi-skill-mode.md +4 -4
- package/src/skf-export-skill/references/orphan-context-detection.md +13 -5
- package/src/skf-export-skill/references/orphan-row-detection.md +31 -22
- package/src/skf-export-skill/references/package.md +15 -73
- package/src/skf-export-skill/references/preflight-snippet-root-probe.md +51 -70
- package/src/skf-export-skill/references/result-envelope.md +31 -16
- package/src/skf-export-skill/references/summary.md +41 -17
- package/src/skf-export-skill/references/token-report.md +4 -12
- package/src/skf-export-skill/references/update-context.md +118 -237
- package/src/skf-forger/SKILL.md +61 -37
- package/src/skf-forger/bmad-skill-manifest.yaml +4 -1
- package/src/skf-forger/customize.toml +43 -0
- package/src/skf-forger/references/pipeline-mode.md +73 -18
- package/src/skf-forger/scripts/forge-status.py +299 -0
- package/src/skf-forger/scripts/parse-pipeline.py +322 -54
- package/src/skf-forger/scripts/pipeline-gate.py +428 -0
- package/src/skf-forger/scripts/pipeline-journal.py +1052 -0
- package/src/skf-quick-skill/SKILL.md +54 -53
- package/src/skf-quick-skill/assets/skill-template.md +4 -2
- package/src/skf-quick-skill/customize.toml +51 -20
- package/src/skf-quick-skill/references/batch-mode.md +74 -21
- package/src/skf-quick-skill/references/compile.md +30 -31
- package/src/skf-quick-skill/references/ecosystem-check.md +7 -57
- package/src/skf-quick-skill/references/finalize.md +69 -18
- package/src/skf-quick-skill/references/halt-contract.md +41 -29
- package/src/skf-quick-skill/references/health-check.md +5 -3
- package/src/skf-quick-skill/references/quick-extract.md +114 -45
- package/src/skf-quick-skill/references/registry-resolution.md +9 -64
- package/src/skf-quick-skill/references/resolve-target.md +116 -66
- package/src/skf-quick-skill/references/write-and-validate.md +79 -40
- package/src/skf-refine-architecture/SKILL.md +43 -53
- package/src/skf-refine-architecture/customize.toml +49 -20
- package/src/skf-refine-architecture/references/compile.md +97 -54
- package/src/skf-refine-architecture/references/exit-codes.md +30 -0
- package/src/skf-refine-architecture/references/finding-storage.md +21 -0
- package/src/skf-refine-architecture/references/gap-analysis.md +101 -38
- package/src/skf-refine-architecture/references/improvements.md +14 -20
- package/src/skf-refine-architecture/references/init.md +98 -57
- package/src/skf-refine-architecture/references/issue-detection.md +32 -39
- package/src/skf-refine-architecture/references/refinement-rules.md +37 -48
- package/src/skf-refine-architecture/references/report.md +65 -54
- package/src/skf-refine-architecture/scripts/skf-check-preservation.py +1619 -0
- package/src/skf-rename-skill/SKILL.md +19 -54
- package/src/skf-rename-skill/customize.toml +32 -26
- package/src/skf-rename-skill/references/execute.md +230 -184
- package/src/skf-rename-skill/references/exit-codes.md +7 -7
- package/src/skf-rename-skill/references/health-check.md +1 -7
- package/src/skf-rename-skill/references/invocation-contract.md +25 -0
- package/src/skf-rename-skill/references/report.md +63 -52
- package/src/skf-rename-skill/references/select.md +197 -115
- package/src/skf-rename-skill/scripts/skf-validate-rename-name.py +161 -21
- package/src/skf-setup/SKILL.md +26 -26
- package/src/skf-setup/customize.toml +14 -10
- package/src/skf-setup/references/auto-index.md +50 -63
- package/src/skf-setup/references/ccc-index.md +29 -90
- package/src/skf-setup/references/detect-and-tier.md +58 -67
- package/src/skf-setup/references/health-check.md +2 -0
- package/src/skf-setup/references/invocation-contract.md +14 -0
- package/src/skf-setup/references/report.md +43 -166
- package/src/skf-setup/references/tier-rules.md +5 -5
- package/src/skf-setup/references/write-config.md +34 -57
- package/src/skf-test-skill/SKILL.md +17 -57
- package/src/skf-test-skill/assets/output-section-formats.md +33 -34
- package/src/skf-test-skill/customize.toml +27 -13
- package/src/skf-test-skill/references/coherence-check.md +134 -62
- package/src/skf-test-skill/references/coverage-check-tiers.md +35 -0
- package/src/skf-test-skill/references/coverage-check.md +209 -264
- package/src/skf-test-skill/references/detect-mode.md +5 -5
- package/src/skf-test-skill/references/external-validators.md +94 -82
- package/src/skf-test-skill/references/health-check.md +6 -7
- package/src/skf-test-skill/references/init.md +164 -91
- package/src/skf-test-skill/references/invocation-contract.md +66 -0
- package/src/skf-test-skill/references/migration-section-rules.md +5 -2
- package/src/skf-test-skill/references/report.md +164 -142
- package/src/skf-test-skill/references/score.md +80 -107
- package/src/skf-test-skill/references/scoring-rules.md +42 -155
- package/src/skf-test-skill/references/source-access-protocol.md +18 -94
- package/src/skf-test-skill/references/step-hard-gate.md +51 -33
- package/src/skf-test-skill/scripts/aggregate-coherence.py +218 -30
- package/src/skf-test-skill/scripts/build-result-context.py +380 -0
- package/src/skf-test-skill/scripts/check-metadata-coherence.py +37 -4
- package/src/skf-test-skill/scripts/combine-external-scores.py +23 -6
- package/src/skf-test-skill/scripts/compute-score.py +223 -45
- package/src/skf-test-skill/scripts/gap-ledger.py +1666 -0
- package/src/skf-test-skill/scripts/hard-gate.py +203 -0
- package/src/skf-test-skill/scripts/load-coverage-inputs.py +1198 -0
- package/src/skf-test-skill/scripts/locate-export-segments.py +835 -0
- package/src/skf-test-skill/scripts/reconcile-coverage.py +547 -79
- package/src/skf-test-skill/scripts/score-signatures.py +479 -0
- package/src/skf-test-skill/scripts/stage-helper-payload.py +148 -0
- package/src/skf-test-skill/scripts/validate-inventory.py +311 -16
- package/src/skf-test-skill/scripts/verify-declared-numerator.py +133 -56
- package/src/skf-test-skill/templates/test-report-template.md +21 -15
- package/src/skf-update-skill/SKILL.md +38 -25
- package/src/skf-update-skill/customize.toml +27 -12
- package/src/skf-update-skill/references/detect-changes.md +253 -223
- package/src/skf-update-skill/references/gap-driven.md +336 -0
- package/src/skf-update-skill/references/health-check.md +31 -5
- package/src/skf-update-skill/references/init.md +254 -84
- package/src/skf-update-skill/references/invocation-contract.md +12 -0
- package/src/skf-update-skill/references/manual-section-rules.md +6 -23
- package/src/skf-update-skill/references/merge.md +182 -49
- package/src/skf-update-skill/references/re-extract.md +53 -262
- package/src/skf-update-skill/references/report.md +102 -35
- package/src/skf-update-skill/references/write.md +357 -155
- package/src/skf-update-skill/scripts/skf-new-file-diff.py +183 -46
- package/src/skf-verify-stack/SKILL.md +23 -42
- package/src/skf-verify-stack/assets/feasibility-report-template.md +11 -5
- package/src/skf-verify-stack/customize.toml +55 -22
- package/src/skf-verify-stack/references/coverage-patterns.md +17 -8
- package/src/skf-verify-stack/references/coverage.md +67 -64
- package/src/skf-verify-stack/references/exit-codes.md +21 -8
- package/src/skf-verify-stack/references/init.md +107 -62
- package/src/skf-verify-stack/references/integration-verification-rules.md +12 -13
- package/src/skf-verify-stack/references/integrations.md +106 -65
- package/src/skf-verify-stack/references/report.md +59 -42
- package/src/skf-verify-stack/references/requirements.md +32 -9
- package/src/skf-verify-stack/references/synthesize.md +53 -39
- package/src/skf-verify-stack/scripts/skf-coverage-tally.py +398 -52
- package/src/skf-verify-stack/scripts/skf-previous-report.py +330 -0
- package/src/skf-verify-stack/scripts/skf-report-delta.py +453 -49
- package/src/skf-verify-stack/scripts/skf-verdict-rollup.py +240 -27
- package/tools/cli/commands/install.js +11 -4
- package/tools/cli/commands/status.js +15 -3
- package/tools/cli/commands/update.js +11 -4
- package/tools/cli/lib/tool-check.js +320 -0
- package/tools/cli/lib/version-check.js +22 -9
- package/tools/cli/skf-cli.js +4 -1
- package/.gitattributes +0 -16
- package/.nvmrc +0 -1
- package/docs/_internal/RELEASING.md +0 -679
- package/release-audits/v1.0.0-launch-audit.md +0 -728
- package/src/skf-audit-skill/references/step-doc-drift.md +0 -177
- package/src/skf-brief-skill/references/headless-source-authority-detection.md +0 -26
- package/src/skf-campaign/manifest.yaml +0 -15
- package/src/skf-create-skill/assets/tessl-dismissal-rules.md +0 -106
- package/src/skf-create-skill/references/ecosystem-check.md +0 -74
- package/src/skf-drop-skill/references/headless-contract.md +0 -18
- package/src/skf-update-skill/references/merge-conflict-rules.md +0 -15
- package/src/skf-update-skill/references/remote-source-resolution.md +0 -98
- package/src/skf-update-skill/references/validate.md +0 -124
- package/tools/validate-docs-drift.js +0 -233
- package/tools/validate-docs-links.js +0 -665
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
nextStepFile: 'severity-classify.md'
|
|
3
|
+
outputFile: '{forge_version}/drift-report-{timestamp}.md'
|
|
4
|
+
# This run's stage data folder: step 5 classifies the JSON saved here.
|
|
5
|
+
auditDataFolder: '{forge_version}/.skf-audit/{timestamp}'
|
|
6
|
+
compareConstituentHashesProbeOrder:
|
|
7
|
+
- '{project-root}/_bmad/skf/shared/scripts/skf-hash-content.py'
|
|
8
|
+
- '{project-root}/src/shared/scripts/skf-hash-content.py'
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<!-- Config: communicate in {communication_language}. -->
|
|
12
|
+
|
|
13
|
+
# Step 1c: Constituent Freshness
|
|
14
|
+
|
|
15
|
+
## STEP GOAL:
|
|
16
|
+
|
|
17
|
+
Audit a compose-mode stack in place of steps 2 to 4: check whether each constituent skill changed since the stack was composed, save the comparison for step 5, and write the Structural Drift section. A compose-mode stack has no source tree to re-index: its provenance entries record the constituent skills it was composed from, so a source diff would read every one of them as removed.
|
|
18
|
+
|
|
19
|
+
## Rules
|
|
20
|
+
|
|
21
|
+
- Run only for a compose-mode stack (`{compose_mode_stack}`, step 1 §4): every other skill runs steps 2 to 4
|
|
22
|
+
- Do not classify severity (step 5) or suggest remediation (step 6)
|
|
23
|
+
|
|
24
|
+
## MANDATORY SEQUENCE
|
|
25
|
+
|
|
26
|
+
**Halt envelope.** Every HALT in this step names its exit code, `halt_reason` and phase. In headless mode, stage `{run_dir}/halt.json` as `{"phase": "<phase>", "reason": "<the halt message>", "halt_reason": "<halt_reason>", "skill_name": "{skill_name}", "report_path": "{outputFile}"}`, adding `"path"` when the halt names one, then run:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
uv run {emitEnvelopeHelper} emit-halt --workflow skf-audit-skill --run-dir "{run_dir}" --target stderr < "{run_dir}/halt.json"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Display the line it prints, then stop with the halt's exit code. If the emitter exits non-zero or prints no line, display the halt message alone. An interactive HALT displays its message and emits nothing.
|
|
33
|
+
|
|
34
|
+
### 1. Compare the Constituents' Hashes
|
|
35
|
+
|
|
36
|
+
Each constituent's `metadata_hash` is the sha256 of its raw `metadata.json` bytes when the stack was composed, which the model cannot compute itself: run the helper.
|
|
37
|
+
|
|
38
|
+
**Resolve `{compareConstituentHashesHelper}`** from `{compareConstituentHashesProbeOrder}`; first existing path wins. If no candidate exists, HALT with **exit 3**, `halt_reason: "helper-missing"`, phase `constituent-freshness:compare`: "`skf-hash-content.py` is not installed. Re-install SKF." A relative constituent `skill_path` (e.g. `skills/{skill-dir}/`) is project-root-relative, so the helper resolves it against `{project-root}`. Create the stage data folder first (`mkdir -p "{auditDataFolder}"`), then save the comparison in it:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
uv run {compareConstituentHashesHelper} compare-constituent-hashes "{provenanceMap}" --skills-root "{project-root}" > "{auditDataFolder}/constituent-freshness.json"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The saved JSON, which step 5 builds its findings from:
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"drifted": [{"skill_name": "...", "skill_path": "...", "stored_hash": "sha256:...", "current_hash": "sha256:..."}],
|
|
49
|
+
"fresh": [{"skill_name": "..."}],
|
|
50
|
+
"missing": [{"skill_name": "...", "skill_path": "...", "stored_hash": "sha256:...", "reason": "metadata-not-found|incomplete-record"}],
|
|
51
|
+
"skipped_null_hash": [{"skill_name": "..."}],
|
|
52
|
+
"stats": {"total": N, "drifted": N, "fresh": N, "missing": N, "skipped_null_hash": N}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- `drifted[]`: a constituent whose live `metadata.json` differs from the one the stack was composed from. Step 5 grades each one HIGH.
|
|
57
|
+
- `missing[]`: a constituent whose `metadata.json` cannot be found (`metadata-not-found`), or whose provenance record lacks `skill_name` or `skill_path` (`incomplete-record`). Step 5 grades each one MEDIUM.
|
|
58
|
+
- `skipped_null_hash[]`: no hash was recorded when the stack was composed (a references/ cascade), so there is nothing to compare. Never drift.
|
|
59
|
+
- `fresh[]`: unchanged.
|
|
60
|
+
|
|
61
|
+
If the command exits non-zero, the map's constituents cannot be compared: HALT with **exit 3**, `halt_reason: "provenance-invalid"`, phase `constituent-freshness:compare`, `"path": "{provenanceMap}"`, showing its stderr. Never hash by hand: a hash made up without the helper would be a finding with no source behind it.
|
|
62
|
+
|
|
63
|
+
If the stage data folder or the file cannot be written, HALT with **exit 4**, `halt_reason: "write-failed"`, phase `constituent-freshness:save`, `"path": "{auditDataFolder}/constituent-freshness.json"`.
|
|
64
|
+
|
|
65
|
+
### 2. Compile the Structural Drift Section
|
|
66
|
+
|
|
67
|
+
Append to {outputFile}, taking every count from `stats` (no recount):
|
|
68
|
+
|
|
69
|
+
```markdown
|
|
70
|
+
## Structural Drift
|
|
71
|
+
|
|
72
|
+
**Comparison:** each constituent skill now vs when the stack was composed ({provenance_generated_at})
|
|
73
|
+
**Method:** metadata hash comparison: a compose-mode stack has no source tree to re-index
|
|
74
|
+
|
|
75
|
+
### Constituent Freshness (drifted {stats.drifted}, missing {stats.missing}, fresh {stats.fresh})
|
|
76
|
+
|
|
77
|
+
| Constituent | Compose-time Hash | Current Hash |
|
|
78
|
+
|-------------|-------------------|--------------|
|
|
79
|
+
| {skill_name} | `{stored_hash}` | `{current_hash}` |
|
|
80
|
+
|
|
81
|
+
**Missing constituents:** {skill_name} ({reason}) for each `missing[]` entry, or none.
|
|
82
|
+
**Not compared (no compose-time hash):** {skill_name} for each `skipped_null_hash[]` entry, or none.
|
|
83
|
+
|
|
84
|
+
## Semantic Drift
|
|
85
|
+
|
|
86
|
+
**Status:** Skipped: a compose-mode stack has no source tree to compare
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3. Update Report and Auto-Proceed
|
|
90
|
+
|
|
91
|
+
Update {outputFile} frontmatter: append `'constituent-freshness'` to `stepsCompleted`. Once both sections have been appended, load, read fully, and execute `{nextStepFile}` (severity classification).
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
nextStepFile: 'report.md'
|
|
3
|
+
# A docs-only skill (step 1 §3) goes on to step 5 instead, which grades each
|
|
4
|
+
# changed document: this comparison is the only drift such a skill has.
|
|
5
|
+
classifyStepFile: 'severity-classify.md'
|
|
6
|
+
outputFile: '{forge_version}/drift-report-{timestamp}.md'
|
|
7
|
+
# This run's stage data folder: §2 saves the comparison here.
|
|
8
|
+
auditDataFolder: '{forge_version}/.skf-audit/{timestamp}'
|
|
9
|
+
# §2's comparison helper: the installed SKF module path first, then the src/
|
|
10
|
+
# dev-checkout path.
|
|
11
|
+
compareDocHashesProbeOrder:
|
|
12
|
+
- '{project-root}/_bmad/skf/shared/scripts/skf-detect-docs.py'
|
|
13
|
+
- '{project-root}/src/shared/scripts/skf-detect-docs.py'
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
<!-- Config: communicate in {communication_language}. -->
|
|
17
|
+
|
|
18
|
+
# Step 5a: Documentation Drift
|
|
19
|
+
|
|
20
|
+
## STEP GOAL:
|
|
21
|
+
|
|
22
|
+
Compare the content hash each tracked document had at compile time (`doc_sources` in metadata.json) with its current upstream state, and report which documents changed, which could not be reached and which were never hashed. For a skill built from source this is informational: doc drift does not move the drift score. A docs-only skill has no other drift, so for it step 5 grades each changed document.
|
|
23
|
+
|
|
24
|
+
## Rules
|
|
25
|
+
|
|
26
|
+
- Auto-proceed, no user interaction, and do not classify severity here. Graceful failure: a URL that cannot be fetched is `fetch_failed`, never a halt by itself (a docs-only skill halts only when it could compare no document at all, §2). For a skill built from source, never abort the audit on a failure here: skip the check with a note
|
|
27
|
+
- `{docs_only_skill}` is the `docs_only_skill` value step 1 §6 wrote into {outputFile}'s frontmatter: read it there, not from memory, so a compacted session still takes the docs-only route
|
|
28
|
+
|
|
29
|
+
## MANDATORY SEQUENCE
|
|
30
|
+
|
|
31
|
+
**Halt envelope.** Only a docs-only skill halts here (§2), and step 1 read no private source tree for it. In headless mode, stage `{run_dir}/halt.json` as `{"phase": "<phase>", "reason": "<the halt message>", "halt_reason": "<halt_reason>", "skill_name": "{skill_name}", "report_path": "{outputFile}"}`, adding `"path"` when the halt names one, then run:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
uv run {emitEnvelopeHelper} emit-halt --workflow skf-audit-skill --run-dir "{run_dir}" --target stderr < "{run_dir}/halt.json"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Display the line it prints, then stop with the halt's exit code. If the emitter exits non-zero or prints no line, display the halt message alone. An interactive HALT displays its message and emits nothing.
|
|
38
|
+
|
|
39
|
+
### 1. Check for doc_sources
|
|
40
|
+
|
|
41
|
+
Check the skill metadata loaded at init (step 1 §3, Load Skill Artifacts) for a `doc_sources` array. A docs-only skill always has one with a recorded `content_hash`: step 1 §3 stops a docs-only skill without it.
|
|
42
|
+
|
|
43
|
+
**If `doc_sources` is absent:** append the section below to {outputFile}, set `doc_drift_summary = { skipped_entirely: true }`, append `'doc-drift'` to `stepsCompleted` in its frontmatter and auto-proceed to {nextStepFile}:
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
## Documentation Drift
|
|
47
|
+
|
|
48
|
+
No doc_sources recorded: skip doc drift check. This skill was compiled before doc tracking was available. Recompile with the current CS pipeline to enable doc drift detection.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**If `doc_sources` is an empty array:** do the same with `doc_drift_summary = { total_tracked: 0, skipped_entirely: false }` and this section:
|
|
52
|
+
|
|
53
|
+
```markdown
|
|
54
|
+
## Documentation Drift
|
|
55
|
+
|
|
56
|
+
No documentation sources tracked. The `doc_sources` array is empty: no drift check to perform.
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Otherwise** continue to §2.
|
|
60
|
+
|
|
61
|
+
### 2. Fetch and Hash Each Tracked Doc
|
|
62
|
+
|
|
63
|
+
Run the script rather than fetching yourself: the stored hashes are `sha256:{hexdigest}` of each document's raw response bytes, which the model cannot compute. Resolve `{compareDocHashesHelper}` ← first existing path in `{compareDocHashesProbeOrder}` (SKILL.md On Activation checked that one exists) and, from `{project-root}`, save the comparison in the stage data folder:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
mkdir -p "{auditDataFolder}"
|
|
67
|
+
uv run {compareDocHashesHelper} compare-hashes "{resolved_skill_package}/metadata.json" > "{auditDataFolder}/doc-drift.json"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
It fetches each URL whose `content_hash` is set and compares the hashes. A `null` `content_hash` is not fetched (`skipped_null_hash`: there is no baseline), and a network error, a timeout or a non-200 status is `fetch_failed`, which is not drift. The saved JSON:
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"changed": [{"url": "...", "old_hash": "sha256:...", "new_hash": "sha256:..."}],
|
|
75
|
+
"unchanged": [{"url": "..."}],
|
|
76
|
+
"fetch_failed": [{"url": "...", "old_hash": "sha256:...", "reason": "..."}],
|
|
77
|
+
"skipped_null_hash": [{"url": "..."}],
|
|
78
|
+
"stats": {"total_tracked": N, "changed": N, "unchanged": N, "fetch_failed": N, "skipped_null_hash": N}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**If the command exits non-zero** (exit 2 is a `doc_sources` it cannot read) or saves no JSON:
|
|
83
|
+
|
|
84
|
+
- **A skill built from source:** delete the file, append the section below to {outputFile}, set `doc_drift_summary = { skipped_entirely: true }`, append `'doc-drift'` to `stepsCompleted` and auto-proceed to {nextStepFile}:
|
|
85
|
+
|
|
86
|
+
```markdown
|
|
87
|
+
## Documentation Drift
|
|
88
|
+
|
|
89
|
+
Doc drift check skipped: the comparison failed ({the first stderr line}).
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- **A docs-only skill** (`{docs_only_skill}`): this comparison is its whole audit, so HALT with **exit 3**, phase `doc-drift:compare`, showing the first stderr line: on exit 2, `halt_reason: "provenance-invalid"` with `"path": "{resolved_skill_package}/metadata.json"` (its `doc_sources` is the record the audit compares against); otherwise `halt_reason: "helper-missing"`.
|
|
93
|
+
|
|
94
|
+
**Once the comparison is saved, a docs-only skill** (`{docs_only_skill}`) is graded only on the documents it compared:
|
|
95
|
+
|
|
96
|
+
- **`stats.changed` + `stats.unchanged` is 0:** no document was compared (each one failed to fetch or has no recorded hash), and a CLEAN score would vouch for documents nobody read. HALT with **exit 3**, `halt_reason: "source-unreadable"`, phase `doc-drift:compare`, `"path": "{resolved_skill_package}/metadata.json"`: "**No documentation source of `{skill_name}` could be compared.** {each `fetch_failed` URL with its `reason`, then each `skipped_null_hash` URL with `no hash recorded`}. Re-run once the documents can be reached, or re-create the skill with `[CS] Create Skill` to record their hashes."
|
|
97
|
+
- **Otherwise,** record each of `stats.fetch_failed` and `stats.skipped_null_hash` that is not 0 as a warning, so the envelope shows the score leaves those documents out: `uv run {emitEnvelopeHelper} record --run-dir "{run_dir}" --warning "doc_fetch_failed: {fetch_failed}"` and `uv run {emitEnvelopeHelper} record --run-dir "{run_dir}" --warning "doc_not_hashed: {skipped_null_hash}"`.
|
|
98
|
+
|
|
99
|
+
### 3. Build Drift Findings
|
|
100
|
+
|
|
101
|
+
Take the four buckets (`changed[]`, `unchanged[]`, `fetch_failed[]`, `skipped_null_hash[]`) and every count from the saved JSON's `stats`: never recount.
|
|
102
|
+
|
|
103
|
+
### 4. Append to Drift Report
|
|
104
|
+
|
|
105
|
+
Append the `## Documentation Drift` section to {outputFile}.
|
|
106
|
+
|
|
107
|
+
**When drift detected:**
|
|
108
|
+
|
|
109
|
+
```markdown
|
|
110
|
+
## Documentation Drift
|
|
111
|
+
|
|
112
|
+
| URL | Old Hash | New Hash | Detected At |
|
|
113
|
+
|-----|----------|----------|-------------|
|
|
114
|
+
| {url} | `{old_hash}` | `{new_hash}` | {ISO-8601 timestamp} |
|
|
115
|
+
|
|
116
|
+
**{changed} of {total_tracked} tracked documentation source(s) have changed since compile.**
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Rows, in this order: each `changed` entry with its old and new hash; each `fetch_failed` entry, with `_(fetch failed: {reason})_` as its New Hash; each `skipped_null_hash` entry, with `_(not recorded)_` as its Old Hash and `n/a` in the last two columns. An unchanged entry gets no row, and only the `changed` rows count as drift.
|
|
120
|
+
|
|
121
|
+
**When no drift detected:**
|
|
122
|
+
|
|
123
|
+
```markdown
|
|
124
|
+
## Documentation Drift
|
|
125
|
+
|
|
126
|
+
No documentation drift detected. All {total_tracked} tracked documentation source(s) match their compile-time hashes.
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
If some entries were `fetch_failed` or `skipped_null_hash`, append a note after the main message listing those entries.
|
|
130
|
+
|
|
131
|
+
### 5. Store Context and Auto-Proceed
|
|
132
|
+
|
|
133
|
+
Set `doc_drift_summary` to the saved JSON's `stats` (`total_tracked`, `changed`, `unchanged`, `fetch_failed`, `skipped_null_hash`) plus `skipped_entirely: false`: report.md reads it. Append `'doc-drift'` to `stepsCompleted` in {outputFile}'s frontmatter.
|
|
134
|
+
|
|
135
|
+
Display: "**Documentation drift check complete. {changed} of {total_tracked} source(s) drifted.**"
|
|
136
|
+
|
|
137
|
+
Load, read the full file, then execute {nextStepFile}, or `{classifyStepFile}` for a docs-only skill (`{docs_only_skill}`), whose changed documents step 5 grades.
|
|
138
|
+
|
|
139
|
+
## CRITICAL STEP COMPLETION NOTE
|
|
140
|
+
|
|
141
|
+
Only after the `## Documentation Drift` section is appended and `doc_drift_summary` is set, load and read fully the next step file.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Headless Contract
|
|
2
|
+
|
|
3
|
+
The outputs, exit codes and result envelope of skf-audit-skill. Each stage's **Halt envelope** paragraph names the exit code, `halt_reason` and phase of every HALT in it and shows the emitter command that prints it.
|
|
4
|
+
|
|
5
|
+
## Outputs
|
|
6
|
+
|
|
7
|
+
A run writes in `{forge_version}/`, the audited version's folder: `drift-report-{timestamp}.md`, with the run context, `drift_score` and `nextWorkflow` in its frontmatter; the JSON it was built from, in `.skf-audit/{timestamp}/`; and, from step 6, the result contract `audit-skill-result-{YYYYMMDD-HHmmss}.json` and its `audit-skill-result-latest.json` copy, written by the shared emitter. The shared clone at the recorded source path never changes: an audit of a newer upstream ref reads it from a private tree.
|
|
8
|
+
|
|
9
|
+
## Exit Codes
|
|
10
|
+
|
|
11
|
+
Every hard halt in this workflow exits with a stable code so headless automators can branch on the failure class without grepping message text:
|
|
12
|
+
|
|
13
|
+
| Code | Meaning | Raised by |
|
|
14
|
+
| ---- | -------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
15
|
+
| 0 | success | step 7 (terminal health-check) |
|
|
16
|
+
| 2 | input-missing | step 1 §1: no `skill_name` supplied in headless mode (interactive prompt cannot resolve) |
|
|
17
|
+
| 3 | resolution-failure | On Activation (`uv`, or a helper the stages share, is missing → `helper-missing`); step 1 §1 (skill not found at resolved path: missing `SKILL.md` → `skill-not-found`; or a flat `SKILL.md` with no SKF marker in its `metadata.json` → `not-skf-output`); step 1 §2 (`forge-tier.yaml` missing: setup-forge not run → `forge-tier-missing`); step 1 §3 and §4 (the skill records nothing to audit against: a docs-only skill whose `doc_sources` records no hash, any other skill without a provenance map → `no-baseline`); step 1 §4, step 1c, step 3 §1 and, for a docs-only skill, step 5a (the provenance map or `doc_sources` cannot be read → `provenance-invalid`); step 1 §5 (source directory no longer exists / inaccessible → `source-dir-missing`); step 2 §3 (files the snapshot still lists to read after they were read by eye) and, for a docs-only skill, step 5a (no document could be compared: each failed to fetch or has no recorded hash) → `source-unreadable`; any step whose required helper resolves to no path or crashes → `helper-missing` |
|
|
18
|
+
| 4 | write-failure | step 1 §6 / step 6 §4 (drift report write failed: read-only mount, disk full, permissions denied); step 1c, step 2 §2 and §3, step 3 §1 and step 5 §2 (a file in the stage data folder cannot be written); step 6's result contract (the emitter refuses the result payload twice) → `write-failed` |
|
|
19
|
+
| 6 | user-cancelled | step 1 §1 manifest-vs-symlink gate `[X]` · step 1's upstream-drift gate `[X]` (`upstream-checkout.md`) · step 1 §7 baseline confirm gate `[X]` |
|
|
20
|
+
|
|
21
|
+
## Result Contract (Headless)
|
|
22
|
+
|
|
23
|
+
When `{headless_mode}` is true, step 6 prints one `SKF_AUDIT_RESULT_JSON: {...}` line on **stdout**, which the health check (step 7) displays as the run's last line, and every hard halt one on **stderr** with `status: "error"`. The shared emitter builds each line from the payload the stage stages in `{run_dir}`, folds in the decisions and warnings the run recorded there, stamps `run_id` and `result_path`, and checks it against `{project-root}/_bmad/skf/shared/scripts/schemas/skf-audit-result-envelope.v1.json` (`{project-root}/src/shared/scripts/schemas/skf-audit-result-envelope.v1.json` in a dev checkout), whose descriptions say what each field holds. Never type the line yourself:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
SKF_AUDIT_RESULT_JSON: {"status":"success|error","skill_name":"…","drift_score":"CLEAN|MINOR|SIGNIFICANT|CRITICAL|null","report_path":"…|null","next_workflow":"update-skill|null","audit_ref":"…|null","upstream_moved":true|false|null,"upstream_ref":"…|null","exit_code":0,"halt_reason":null,"run_id":"…","result_path":"…|null"}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`next_workflow` is `"update-skill"` when CRITICAL or HIGH findings exist or when `upstream_moved` is true, otherwise `null`; pass `upstream_ref` to update-skill as `--target-ref`. `headless_decisions`, `warnings` and `error` appear when they apply. `halt_reason` is one of: `null` (success), `"input-missing"`, `"skill-not-found"`, `"not-skf-output"`, `"forge-tier-missing"`, `"no-baseline"`, `"source-dir-missing"`, `"provenance-invalid"`, `"source-unreadable"`, `"helper-missing"`, `"write-failed"`, `"user-cancelled"`. `exit_code` matches the table above.
|
|
@@ -13,6 +13,8 @@ nextStepFile: 'shared/health-check.md'
|
|
|
13
13
|
|
|
14
14
|
Chain to the shared workflow self-improvement health check at `{nextStepFile}`. This is the terminal step of audit-skill — after the shared health check completes, the workflow is fully done.
|
|
15
15
|
|
|
16
|
+
In a headless run report.md's Result Contract bound `{result_envelope_line}` to the `SKF_AUDIT_RESULT_JSON` line without displaying it: the shared health check displays that line verbatim as the run's last line wherever it stops, so a `claude -p` caller reads the envelope as the final message.
|
|
17
|
+
|
|
16
18
|
## Rules
|
|
17
19
|
|
|
18
20
|
- No user-facing reports, file writes, or result contracts in this step — those belong in step 6
|