bmad-module-skill-forge 0.10.0 → 0.10.1-alpha.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 +39 -0
- package/.gitattributes +16 -0
- package/README.md +105 -38
- package/docs/404.md +13 -10
- package/docs/RELEASING.md +185 -0
- package/docs/STABILITY.md +123 -0
- package/docs/_data/pinned.yaml +98 -0
- package/docs/agents.md +16 -11
- package/docs/architecture.md +221 -0
- package/docs/bmad-synergy.md +11 -13
- package/docs/concepts.md +18 -108
- package/docs/examples.md +121 -80
- package/docs/getting-started.md +85 -147
- package/docs/how-it-works.md +25 -536
- package/docs/index.md +44 -27
- package/docs/skill-model.md +328 -0
- package/docs/troubleshooting.md +39 -0
- package/docs/verifying-a-skill.md +232 -0
- package/docs/why-skf.md +93 -0
- package/docs/workflows.md +119 -13
- package/package.json +25 -4
- package/src/README.md +23 -25
- package/src/forger/forge-tier.yaml +4 -2
- package/src/forger/preferences.yaml +7 -1
- package/src/knowledge/agentskills-spec.md +1 -1
- package/src/knowledge/architecture-verification.md +1 -1
- package/src/knowledge/ccc-bridge.md +16 -15
- package/src/knowledge/overview.md +11 -11
- package/src/knowledge/progressive-capability.md +3 -3
- package/src/knowledge/provenance-tracking.md +9 -3
- package/src/knowledge/qmd-registry.md +8 -8
- package/src/knowledge/skf-knowledge-index.csv +2 -2
- package/src/knowledge/skill-lifecycle.md +16 -1
- package/src/knowledge/split-body-strategy.md +1 -1
- package/src/knowledge/version-paths.md +17 -12
- package/src/module-help.csv +18 -17
- package/src/shared/health-check.md +372 -0
- package/src/shared/references/feasibility-report-schema.md +86 -0
- package/src/shared/references/headless-gate-convention.md +62 -0
- package/src/shared/references/output-contract-schema.md +35 -0
- package/src/shared/references/pipeline-contracts.md +102 -0
- package/src/shared/scripts/skf-atomic-write.py +370 -0
- package/src/shared/scripts/skf-manifest-ops.py +236 -0
- package/src/shared/scripts/skf-preflight.py +164 -0
- package/src/shared/scripts/skf-rebuild-managed-sections.py +201 -0
- package/src/shared/scripts/skf-severity-classify.py +163 -0
- package/src/shared/scripts/skf-skill-inventory.py +210 -0
- package/src/shared/scripts/skf-structural-diff.py +257 -0
- package/src/shared/scripts/skf-validate-frontmatter.py +318 -0
- package/src/shared/scripts/skf-validate-output.py +247 -0
- package/src/skf-analyze-source/SKILL.md +57 -0
- package/src/skf-analyze-source/assets/skill-brief-schema.md +125 -0
- package/src/skf-analyze-source/references/unit-detection-heuristics.md +124 -0
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-01-init.md +6 -66
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-01b-continue.md +4 -59
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-02-scan-project.md +7 -68
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-03-identify-units.md +6 -66
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-04-map-and-detect.md +7 -68
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-05-recommend.md +6 -66
- package/src/{workflows/analyze-source → skf-analyze-source}/steps-c/step-06-generate-briefs.md +14 -71
- package/src/skf-analyze-source/steps-c/step-07-health-check.md +22 -0
- package/src/skf-audit-skill/SKILL.md +59 -0
- package/src/{workflows/audit-skill/data → skf-audit-skill/assets}/drift-report-template.md +7 -7
- package/src/{workflows/audit-skill/data → skf-audit-skill/references}/severity-rules.md +11 -11
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-01-init.md +24 -68
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-02-re-index.md +36 -71
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-03-structural-diff.md +21 -63
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-04-semantic-diff.md +6 -65
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-05-severity-classify.md +5 -63
- package/src/{workflows/audit-skill → skf-audit-skill}/steps-c/step-06-report.md +10 -64
- package/src/skf-audit-skill/steps-c/step-07-health-check.md +22 -0
- package/src/skf-brief-skill/SKILL.md +53 -0
- package/src/{workflows/brief-skill/data → skf-brief-skill/assets}/scope-templates.md +23 -0
- package/src/skf-brief-skill/assets/skill-brief-schema.md +206 -0
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-01-gather-intent.md +6 -67
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-02-analyze-target.md +6 -66
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-03-scope-definition.md +12 -68
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-04-confirm-brief.md +5 -63
- package/src/{workflows/brief-skill → skf-brief-skill}/steps-c/step-05-write-brief.md +10 -70
- package/src/skf-brief-skill/steps-c/step-06-health-check.md +22 -0
- package/src/skf-create-skill/SKILL.md +63 -0
- package/src/{workflows/create-skill/data → skf-create-skill/assets}/compile-assembly-rules.md +60 -0
- package/src/{workflows/create-skill/data → skf-create-skill/assets}/skill-sections.md +92 -23
- package/src/skf-create-skill/assets/tessl-dismissal-rules.md +102 -0
- package/src/{workflows/create-skill/data → skf-create-skill/references}/extraction-patterns-tracing.md +13 -13
- package/src/{workflows/create-skill/data → skf-create-skill/references}/extraction-patterns.md +8 -3
- package/src/skf-create-skill/references/source-resolution-protocols.md +239 -0
- package/src/{workflows/create-skill/data → skf-create-skill/references}/tier-degradation-rules.md +8 -7
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-01-load-brief.md +25 -63
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-02-ecosystem-check.md +8 -64
- package/src/skf-create-skill/steps-c/step-03-extract.md +379 -0
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-03d-component-extraction.md +18 -35
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-04-enrich.md +12 -69
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-05-compile.md +71 -75
- package/src/skf-create-skill/steps-c/step-06-validate.md +267 -0
- package/src/{workflows/create-skill → skf-create-skill}/steps-c/step-07-generate-artifacts.md +30 -74
- package/src/skf-create-skill/steps-c/step-08-report.md +145 -0
- package/src/skf-create-skill/steps-c/step-09-health-check.md +23 -0
- package/src/{workflows/create-skill/steps-c → skf-create-skill/steps-c/sub}/step-02b-ccc-discover.md +8 -66
- package/src/skf-create-skill/steps-c/sub/step-03b-fetch-temporal.md +229 -0
- package/src/{workflows/create-skill/steps-c → skf-create-skill/steps-c/sub}/step-03c-fetch-docs.md +18 -42
- package/src/skf-create-stack-skill/SKILL.md +64 -0
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/assets}/stack-skill-template.md +2 -1
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/compose-mode-rules.md +19 -5
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/integration-patterns.md +1 -1
- package/src/{workflows/create-stack-skill/data → skf-create-stack-skill/references}/manifest-patterns.md +10 -10
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-01-init.md +14 -55
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-02-detect-manifests.md +29 -63
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-03-rank-and-confirm.md +9 -59
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-04-parallel-extract.md +29 -64
- package/src/skf-create-stack-skill/steps-c/step-05-detect-integrations.md +164 -0
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-06-compile-stack.md +7 -60
- package/src/skf-create-stack-skill/steps-c/step-07-generate-output.md +328 -0
- package/src/{workflows/create-stack-skill → skf-create-stack-skill}/steps-c/step-08-validate.md +17 -63
- package/src/skf-create-stack-skill/steps-c/step-09-report.md +128 -0
- package/src/skf-create-stack-skill/steps-c/step-10-health-check.md +22 -0
- package/src/skf-drop-skill/SKILL.md +57 -0
- package/src/{workflows/drop-skill → skf-drop-skill}/steps-c/step-01-select.md +9 -69
- package/src/{workflows/drop-skill → skf-drop-skill}/steps-c/step-02-execute.md +30 -106
- package/src/skf-drop-skill/steps-c/step-03-report.md +83 -0
- package/src/skf-drop-skill/steps-c/step-04-health-check.md +22 -0
- package/src/skf-export-skill/SKILL.md +57 -0
- package/src/skf-export-skill/assets/managed-section-format.md +138 -0
- package/src/{workflows/export-skill/data → skf-export-skill/assets}/snippet-format.md +8 -12
- package/src/skf-export-skill/steps-c/step-01-load-skill.md +247 -0
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-02-package.md +5 -58
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-03-generate-snippet.md +15 -77
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-04-update-context.md +59 -133
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-05-token-report.md +4 -58
- package/src/{workflows/export-skill → skf-export-skill}/steps-c/step-06-summary.md +16 -68
- package/src/skf-export-skill/steps-c/step-07-health-check.md +22 -0
- package/src/skf-forger/SKILL.md +110 -0
- package/src/skf-forger/bmad-skill-manifest.yaml +11 -0
- package/src/skf-quick-skill/SKILL.md +56 -0
- package/src/{workflows/quick-skill/data → skf-quick-skill/references}/registry-resolution.md +6 -6
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-01-resolve-target.md +9 -62
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-02-ecosystem-check.md +5 -59
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-03-quick-extract.md +18 -61
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-04-compile.md +6 -60
- package/src/{workflows/quick-skill → skf-quick-skill}/steps-c/step-05-validate.md +58 -78
- package/src/skf-quick-skill/steps-c/step-06-write.md +73 -0
- package/src/skf-quick-skill/steps-c/step-07-health-check.md +22 -0
- package/src/skf-refine-architecture/SKILL.md +57 -0
- package/src/{workflows/refine-architecture/data → skf-refine-architecture/references}/refinement-rules.md +16 -16
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-01-init.md +6 -63
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-02-gap-analysis.md +29 -71
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-03-issue-detection.md +5 -65
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-04-improvements.md +5 -64
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-05-compile.md +5 -56
- package/src/{workflows/refine-architecture → skf-refine-architecture}/steps-c/step-06-report.md +11 -64
- package/src/skf-refine-architecture/steps-c/step-07-health-check.md +22 -0
- package/src/skf-rename-skill/SKILL.md +58 -0
- package/src/{workflows/rename-skill → skf-rename-skill}/steps-c/step-01-select.md +12 -73
- package/src/{workflows/rename-skill → skf-rename-skill}/steps-c/step-02-execute.md +32 -113
- package/src/skf-rename-skill/steps-c/step-03-report.md +83 -0
- package/src/skf-rename-skill/steps-c/step-04-health-check.md +22 -0
- package/src/skf-setup/SKILL.md +55 -0
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-01-detect-and-tier.md +6 -62
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-01b-ccc-index.md +9 -65
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-02-write-config.md +15 -60
- package/src/{workflows/setup-forge → skf-setup}/steps-c/step-03-auto-index.md +7 -66
- package/src/skf-setup/steps-c/step-04-report.md +92 -0
- package/src/skf-setup/steps-c/step-05-health-check.md +22 -0
- package/src/skf-test-skill/SKILL.md +59 -0
- package/src/skf-test-skill/references/migration-section-rules.md +114 -0
- package/src/skf-test-skill/references/scoring-rules.md +207 -0
- package/src/skf-test-skill/references/source-access-protocol.md +109 -0
- package/src/skf-test-skill/scripts/compute-score.py +310 -0
- package/src/skf-test-skill/steps-c/step-01-init.md +238 -0
- package/src/{workflows/test-skill → skf-test-skill}/steps-c/step-02-detect-mode.md +4 -62
- package/src/skf-test-skill/steps-c/step-03-coverage-check.md +347 -0
- package/src/skf-test-skill/steps-c/step-04-coherence-check.md +239 -0
- package/src/{workflows/test-skill → skf-test-skill}/steps-c/step-04b-external-validators.md +42 -77
- package/src/skf-test-skill/steps-c/step-05-score.md +266 -0
- package/src/skf-test-skill/steps-c/step-06-report.md +290 -0
- package/src/skf-test-skill/steps-c/step-07-health-check.md +25 -0
- package/src/skf-test-skill/templates/test-report-template.md +58 -0
- package/src/skf-update-skill/SKILL.md +58 -0
- package/src/{workflows/update-skill/data → skf-update-skill/references}/manual-section-rules.md +6 -6
- package/src/{workflows/update-skill/data → skf-update-skill/references}/merge-conflict-rules.md +5 -5
- package/src/skf-update-skill/references/remote-source-resolution.md +94 -0
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-01-init.md +22 -69
- package/src/skf-update-skill/steps-c/step-02-detect-changes.md +255 -0
- package/src/skf-update-skill/steps-c/step-03-re-extract.md +336 -0
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-04-merge.md +60 -72
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-05-validate.md +5 -62
- package/src/skf-update-skill/steps-c/step-06-write.md +278 -0
- package/src/{workflows/update-skill → skf-update-skill}/steps-c/step-07-report.md +11 -69
- package/src/skf-update-skill/steps-c/step-08-health-check.md +22 -0
- package/src/skf-verify-stack/SKILL.md +60 -0
- package/src/skf-verify-stack/assets/feasibility-report-template.md +76 -0
- package/src/{workflows/verify-stack/data → skf-verify-stack/references}/coverage-patterns.md +12 -4
- package/src/skf-verify-stack/references/integration-verification-rules.md +78 -0
- package/src/skf-verify-stack/steps-c/step-01-init.md +178 -0
- package/src/{workflows/verify-stack → skf-verify-stack}/steps-c/step-02-coverage.md +27 -72
- package/src/skf-verify-stack/steps-c/step-03-integrations.md +179 -0
- package/src/{workflows/verify-stack → skf-verify-stack}/steps-c/step-04-requirements.md +14 -67
- package/src/skf-verify-stack/steps-c/step-05-synthesize.md +147 -0
- package/src/skf-verify-stack/steps-c/step-06-report.md +156 -0
- package/src/skf-verify-stack/steps-c/step-07-health-check.md +25 -0
- package/tools/cli/commands/install.js +1 -1
- package/tools/cli/commands/status.js +21 -23
- package/tools/cli/commands/uninstall.js +11 -19
- package/tools/cli/commands/update.js +2 -2
- package/tools/cli/lib/ide-skills.js +216 -0
- package/tools/cli/lib/installer.js +29 -52
- package/tools/cli/lib/manifest.js +11 -5
- package/tools/cli/lib/platform-codes.yaml +223 -0
- package/tools/cli/lib/ui.js +76 -47
- package/tools/validate-docs-drift.js +193 -0
- package/src/agents/forger.agent.yaml +0 -114
- package/src/workflows/README.md +0 -174
- package/src/workflows/analyze-source/data/skill-brief-schema.md +0 -125
- package/src/workflows/analyze-source/data/unit-detection-heuristics.md +0 -124
- package/src/workflows/analyze-source/workflow.md +0 -61
- package/src/workflows/audit-skill/workflow.md +0 -64
- package/src/workflows/brief-skill/data/skill-brief-schema.md +0 -159
- package/src/workflows/brief-skill/workflow.md +0 -58
- package/src/workflows/create-skill/data/source-resolution-protocols.md +0 -200
- package/src/workflows/create-skill/steps-c/step-03-extract.md +0 -301
- package/src/workflows/create-skill/steps-c/step-03b-fetch-temporal.md +0 -253
- package/src/workflows/create-skill/steps-c/step-06-validate.md +0 -254
- package/src/workflows/create-skill/steps-c/step-08-report.md +0 -179
- package/src/workflows/create-skill/workflow.md +0 -53
- package/src/workflows/create-stack-skill/steps-c/step-05-detect-integrations.md +0 -196
- package/src/workflows/create-stack-skill/steps-c/step-07-generate-output.md +0 -270
- package/src/workflows/create-stack-skill/steps-c/step-09-report.md +0 -150
- package/src/workflows/create-stack-skill/workflow.md +0 -59
- package/src/workflows/drop-skill/steps-c/step-03-report.md +0 -136
- package/src/workflows/drop-skill/workflow.md +0 -63
- package/src/workflows/export-skill/data/managed-section-format.md +0 -103
- package/src/workflows/export-skill/steps-c/step-01-load-skill.md +0 -237
- package/src/workflows/export-skill/workflow.md +0 -58
- package/src/workflows/quick-skill/steps-c/step-06-write.md +0 -178
- package/src/workflows/quick-skill/workflow.md +0 -58
- package/src/workflows/refine-architecture/workflow.md +0 -61
- package/src/workflows/rename-skill/steps-c/step-03-report.md +0 -133
- package/src/workflows/rename-skill/workflow.md +0 -64
- package/src/workflows/setup-forge/steps-c/step-04-report.md +0 -159
- package/src/workflows/setup-forge/workflow.md +0 -51
- package/src/workflows/shared/health-check.md +0 -231
- package/src/workflows/test-skill/data/scoring-rules.md +0 -123
- package/src/workflows/test-skill/data/source-access-protocol.md +0 -51
- package/src/workflows/test-skill/steps-c/step-01-init.md +0 -217
- package/src/workflows/test-skill/steps-c/step-03-coverage-check.md +0 -280
- package/src/workflows/test-skill/steps-c/step-04-coherence-check.md +0 -271
- package/src/workflows/test-skill/steps-c/step-05-score.md +0 -222
- package/src/workflows/test-skill/steps-c/step-06-report.md +0 -208
- package/src/workflows/test-skill/templates/test-report-template.md +0 -28
- package/src/workflows/test-skill/workflow.md +0 -57
- package/src/workflows/update-skill/data/remote-source-resolution.md +0 -57
- package/src/workflows/update-skill/steps-c/step-02-detect-changes.md +0 -221
- package/src/workflows/update-skill/steps-c/step-03-re-extract.md +0 -256
- package/src/workflows/update-skill/steps-c/step-06-write.md +0 -265
- package/src/workflows/update-skill/workflow.md +0 -56
- package/src/workflows/verify-stack/data/feasibility-report-template.md +0 -63
- package/src/workflows/verify-stack/data/integration-verification-rules.md +0 -73
- package/src/workflows/verify-stack/steps-c/step-01-init.md +0 -179
- package/src/workflows/verify-stack/steps-c/step-03-integrations.md +0 -195
- package/src/workflows/verify-stack/steps-c/step-05-synthesize.md +0 -191
- package/src/workflows/verify-stack/steps-c/step-06-report.md +0 -200
- package/src/workflows/verify-stack/workflow.md +0 -61
- package/tools/cli/lib/compiler.js +0 -306
- package/tools/cli/lib/ide-commands.js +0 -244
- /package/src/{workflows/analyze-source → skf-analyze-source}/templates/analysis-report-template.md +0 -0
- /package/src/{workflows/quick-skill/data → skf-quick-skill/assets}/skill-template.md +0 -0
- /package/src/{workflows/setup-forge/data → skf-setup/references}/tier-rules.md +0 -0
- /package/src/{workflows/test-skill/data → skf-test-skill/assets}/output-section-formats.md +0 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 'health-check'
|
|
3
|
+
description: 'Workflow self-improvement health check — captures real friction as GitHub issues'
|
|
4
|
+
# No nextStepFile — this is always the terminal step
|
|
5
|
+
healthCheckRepo: '{health_check_repo}'
|
|
6
|
+
localFallbackFolder: '{output_folder}/improvement-queue'
|
|
7
|
+
seenCachePath: '$HOME/.skf/health-check-seen.json'
|
|
8
|
+
liveSubmitSeverities: ['bug'] # friction/gap go local-queue-default with explicit opt-in
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Health Check: Workflow Self-Improvement
|
|
12
|
+
|
|
13
|
+
> **Path convention:** This file is referenced as `shared/health-check.md` from workflow step frontmatter. All `shared/` paths resolve relative to the SKF module root (`_bmad/skf/` when installed, `src/` during development), not relative to the calling step file.
|
|
14
|
+
|
|
15
|
+
## STEP GOAL:
|
|
16
|
+
|
|
17
|
+
Reflect on the workflow that just completed. If real friction, bugs, or gaps were encountered in the SKF workflow instructions, capture them as structured findings for the user to review and optionally submit as GitHub issues.
|
|
18
|
+
|
|
19
|
+
**Zero overhead for clean runs.** If nothing went wrong, say so and exit immediately.
|
|
20
|
+
|
|
21
|
+
## MANDATORY EXECUTION RULES:
|
|
22
|
+
|
|
23
|
+
### Universal Rules:
|
|
24
|
+
- Read the complete step file before taking any action
|
|
25
|
+
- Speak in `{communication_language}`
|
|
26
|
+
|
|
27
|
+
### Role Reinforcement:
|
|
28
|
+
- You are a **self-improvement auditor** — honest, precise, evidence-based
|
|
29
|
+
- You report ONLY what you actually experienced during THIS session
|
|
30
|
+
- You are NOT a creative writer looking for things to say
|
|
31
|
+
|
|
32
|
+
### Anti-Hallucination Rules:
|
|
33
|
+
- **DO NOT FABRICATE ISSUES.** If the workflow ran smoothly, say so and exit. Inventing issues to appear thorough is a SYSTEM FAILURE.
|
|
34
|
+
- Only report issues you **ACTUALLY encountered** during THIS workflow execution
|
|
35
|
+
- Every finding MUST cite the **specific step file path and section** where the issue occurred
|
|
36
|
+
- If you are unsure whether something was a real issue or your own confusion, DO NOT report it
|
|
37
|
+
- Reporting zero issues is the EXPECTED outcome for a well-designed workflow
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## MANDATORY SEQUENCE
|
|
42
|
+
|
|
43
|
+
### 0. Announce Arrival
|
|
44
|
+
|
|
45
|
+
**Display in `{communication_language}`:**
|
|
46
|
+
|
|
47
|
+
"**Running a quick self-improvement check on this workflow.** If nothing rough came up, I'll close out immediately."
|
|
48
|
+
|
|
49
|
+
**GATE [default: skip]** — If `{headless_mode}`: skip the display entirely, log: "headless: skipped health-check arrival announcement".
|
|
50
|
+
|
|
51
|
+
**If interactive:** display the line above, then proceed to step 1 (Read Workflow Context) without waiting. The line is informational, not a commitment gate — the user's commitment to continuing was already captured upstream (either via an explicit menu in the calling step or by auto-chain). This announcement just tells them what is about to happen.
|
|
52
|
+
|
|
53
|
+
### 1. Read Workflow Context
|
|
54
|
+
|
|
55
|
+
From the current session context, identify:
|
|
56
|
+
- **Workflow name** — which workflow just completed
|
|
57
|
+
- **Steps executed** — which step files were loaded and followed
|
|
58
|
+
- **Any friction points** — moments where instructions were unclear, wrong, contradictory, or missing
|
|
59
|
+
|
|
60
|
+
### 2. Reflect on Execution
|
|
61
|
+
|
|
62
|
+
Silently review the workflow execution. Ask yourself:
|
|
63
|
+
|
|
64
|
+
- Did any step instruction lead me astray or cause unnecessary back-and-forth with the user?
|
|
65
|
+
- Was any step ambiguous, causing me to guess rather than follow clear guidance?
|
|
66
|
+
- Did I encounter a scenario the workflow didn't account for?
|
|
67
|
+
- Were any step instructions wrong or contradictory?
|
|
68
|
+
|
|
69
|
+
**If the answer to ALL of these is "no":**
|
|
70
|
+
|
|
71
|
+
Display:
|
|
72
|
+
|
|
73
|
+
"**Health Check: Clean run.** No workflow issues to report.
|
|
74
|
+
|
|
75
|
+
Workflow complete."
|
|
76
|
+
|
|
77
|
+
**STOP HERE. Do not proceed further. The workflow is done.**
|
|
78
|
+
|
|
79
|
+
### 3. Present Findings (Only If Issues Exist)
|
|
80
|
+
|
|
81
|
+
For each genuine finding, present it in this format:
|
|
82
|
+
|
|
83
|
+
"**Workflow Health Check — {N} finding(s)**
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
**Finding {i}:**
|
|
88
|
+
|
|
89
|
+
| Field | Value |
|
|
90
|
+
|-------|-------|
|
|
91
|
+
| **Severity** | `bug` / `friction` / `gap` |
|
|
92
|
+
| **Workflow** | {workflow name} |
|
|
93
|
+
| **Step File** | `src/skf-{workflow}/steps-c/{step-file-path}` |
|
|
94
|
+
| **Section** | {the specific section or instruction number — use a stable section heading slug, not line numbers} |
|
|
95
|
+
| **Fingerprint** | `fp-{7-hex}` — first 7 hex chars of `sha1("{severity}|{workflow}|{step_file}|{section-slug}")` |
|
|
96
|
+
|
|
97
|
+
**What happened:**
|
|
98
|
+
{Description of the actual issue encountered during execution}
|
|
99
|
+
|
|
100
|
+
**Evidence:**
|
|
101
|
+
{What specifically went wrong — error, confusion, user friction, missing guidance}
|
|
102
|
+
|
|
103
|
+
**Suggested improvement:**
|
|
104
|
+
{Concrete, actionable change to the step file or data}
|
|
105
|
+
|
|
106
|
+
---"
|
|
107
|
+
|
|
108
|
+
**Severity definitions:**
|
|
109
|
+
- **`bug`** — Step instructions were wrong or contradictory
|
|
110
|
+
- **`friction`** — Step worked but was unclear, ambiguous, or caused unnecessary back-and-forth
|
|
111
|
+
- **`gap`** — A scenario arose that the workflow didn't account for at all
|
|
112
|
+
|
|
113
|
+
### 4. User Review Gate
|
|
114
|
+
|
|
115
|
+
After presenting all findings, ask:
|
|
116
|
+
|
|
117
|
+
"**Submit these findings?**
|
|
118
|
+
|
|
119
|
+
- **[Y]** Yes — submit all findings
|
|
120
|
+
- **[N]** No — discard all findings
|
|
121
|
+
- **[E]** Edit — let me revise before submitting
|
|
122
|
+
|
|
123
|
+
_You are the final filter. Reject any finding that doesn't reflect a real issue you observed._"
|
|
124
|
+
|
|
125
|
+
**HALT and wait for user input.**
|
|
126
|
+
|
|
127
|
+
#### Menu Handling:
|
|
128
|
+
|
|
129
|
+
- **IF Y:** Proceed to step 5
|
|
130
|
+
- **IF N:** Display "Findings discarded. Workflow complete." — STOP
|
|
131
|
+
- **IF E:** Let user specify which findings to keep, modify, or remove. Then re-present the revised list and ask again.
|
|
132
|
+
|
|
133
|
+
### 5. Route Each Finding by Severity
|
|
134
|
+
|
|
135
|
+
Before any submission, route each confirmed finding by severity:
|
|
136
|
+
|
|
137
|
+
- **`bug`** → live-submit path (step 5a below). High signal, priority for maintainers.
|
|
138
|
+
- **`friction`** / **`gap`** → local-queue by default (step 5c below). These are the most subjective categories and produce the most near-duplicates. Ask the user once per session: *"Also submit the {N} friction/gap finding(s) as GitHub issues? \[y/N]"* — only if the user affirms explicitly, route them through 5a.
|
|
139
|
+
|
|
140
|
+
### 5a. Live-Submit Path: Compute Fingerprint and Dedup
|
|
141
|
+
|
|
142
|
+
For each finding routed to live-submit:
|
|
143
|
+
|
|
144
|
+
**1. Compute the fingerprint** — a deterministic 7-hex dedup key:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
fp="fp-$(printf '%s|%s|%s|%s' "{severity}" "{workflow}" "{step_file}" "{section-slug}" | sha1sum | cut -c1-7)"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
The `section-slug` is a kebab-case normalized section heading (e.g. `missing-staging-path`). Never include line numbers — they drift when files are edited.
|
|
151
|
+
|
|
152
|
+
**2. Check the local seen-cache** at `{seenCachePath}`:
|
|
153
|
+
|
|
154
|
+
If the cache exists and already contains this fingerprint for this user, skip submission silently and log: `"fp-{hash}: already submitted from this machine on {date}, issue {url} — skipping"`. This prevents the same user from re-reporting the same defect across sessions.
|
|
155
|
+
|
|
156
|
+
**3. Check GitHub CLI availability** with `gh auth status`. If `gh` is unavailable, fall through to step 5c (local fallback).
|
|
157
|
+
|
|
158
|
+
**4. Remote dedup search** — one deterministic call:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
gh search issues --repo {healthCheckRepo} --state open "{fp} in:title" --json number,url,title --limit 1
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**5a-i. If a matching open issue exists:**
|
|
165
|
+
|
|
166
|
+
Present to user:
|
|
167
|
+
|
|
168
|
+
> "**Matching report found:** #{N} — {title}
|
|
169
|
+
>
|
|
170
|
+
> Your finding has the same fingerprint `{fp}`. Options:
|
|
171
|
+
> - **\[R]** React (👍) on the existing issue — silent upvote, adds no comment
|
|
172
|
+
> - **\[C]** React + comment with YOUR environment/evidence delta (use only if it materially differs from the original)
|
|
173
|
+
> - **\[N]** Create a new issue anyway — only if you're certain this is a distinct defect
|
|
174
|
+
> - **\[S]** Skip — don't submit this finding"
|
|
175
|
+
|
|
176
|
+
Execute the chosen action:
|
|
177
|
+
|
|
178
|
+
- **R:** `gh api -X POST /repos/{repo}/issues/{N}/reactions -f content='+1'`
|
|
179
|
+
- **C:** Same reaction call, then `gh issue comment {N} --body "{minimal env+delta body}"`. The delta body is the Environment table plus ONE sentence describing what's different from the original. No session narrative.
|
|
180
|
+
- **N:** Proceed to step 5a-ii.
|
|
181
|
+
- **S:** Record nothing.
|
|
182
|
+
|
|
183
|
+
Record the outcome to the seen-cache under the fingerprint with fields `{action, issue_url, date}`.
|
|
184
|
+
|
|
185
|
+
**5a-ii. If no matching open issue exists** — create a new issue:
|
|
186
|
+
|
|
187
|
+
For each confirmed finding, create a GitHub issue:
|
|
188
|
+
|
|
189
|
+
**First, ensure the `{fp}` label exists** — it is per-fingerprint, so the first reporter of any defect is always creating a brand-new label. `gh issue create --label fp-XXXX` hard-fails if the label is missing, so guard it:
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
gh label create "{fp}" --repo {healthCheckRepo} \
|
|
193
|
+
--color "ededed" \
|
|
194
|
+
--description "Health-check fingerprint dedup key" 2>/dev/null || true
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
The `|| true` makes this idempotent: if the label already exists (second reporter of the same defect whose prior issue was closed, racing a parallel submission, etc.), `gh label create` exits non-zero and we proceed unharmed. The other labels in the command below (`health-check`, `workflow-improvement`, `bug`/`friction`/`gap`) are pre-created repo labels and do not need this guard.
|
|
198
|
+
|
|
199
|
+
**Then create the issue:**
|
|
200
|
+
```
|
|
201
|
+
gh issue create \
|
|
202
|
+
--repo {healthCheckRepo} \
|
|
203
|
+
--title "[health-check][{severity}][{fp}] {workflow}: {short description}" \
|
|
204
|
+
--label "health-check,workflow-improvement,{severity},{fp}" \
|
|
205
|
+
--body "{formatted body using issue template structure}"
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
The fingerprint `{fp}` appears in both title (human-readable) and label (server-side filterable). Maintainers can query all reports for a defect via the `fp-*` label without relying on title text.
|
|
209
|
+
|
|
210
|
+
After the issue is created, write the fingerprint → issue-url mapping to the seen-cache at `{seenCachePath}` so this user never re-reports the same fingerprint.
|
|
211
|
+
|
|
212
|
+
**Writing rules — non-negotiable:**
|
|
213
|
+
|
|
214
|
+
- **One issue per finding.** If you observed two independent problems, submit two issues.
|
|
215
|
+
- **Respect the length budgets.** Finding, Expected, Actual, Impact are each ONE sentence. Evidence is 2-5 bullets, not prose. Suggested Fix is 1-3 sentences with ONE recommendation — multiple options go in the `Alternatives considered` collapsible or (better) not at all.
|
|
216
|
+
- **Quote, don't paraphrase.** In Evidence, cite the exact `file:line` and put the quoted text in quotes. Link the convention to the instruction that caused it.
|
|
217
|
+
- **Never narrate the session.** The reader wants the defect, not the story. If a sentence starts with "During my run..." or "I was trying to...", delete it.
|
|
218
|
+
- **If unsure whether it's a real issue, do not submit it.** Reporting zero findings is a healthy outcome.
|
|
219
|
+
|
|
220
|
+
**Issue body format:**
|
|
221
|
+
```markdown
|
|
222
|
+
## Workflow
|
|
223
|
+
{workflow name, e.g. `skf-create-skill`}
|
|
224
|
+
|
|
225
|
+
## Step File
|
|
226
|
+
`src/skf-{workflow}/steps-c/step-NN-name.md`
|
|
227
|
+
|
|
228
|
+
## Severity
|
|
229
|
+
`{bug | friction | gap}`
|
|
230
|
+
<!-- bug: instructions were wrong or contradictory -->
|
|
231
|
+
<!-- friction: instructions worked but caused back-and-forth or guessing -->
|
|
232
|
+
<!-- gap: a scenario arose that wasn't covered at all -->
|
|
233
|
+
|
|
234
|
+
## Fingerprint
|
|
235
|
+
`{fp}`
|
|
236
|
+
<!-- Deterministic dedup key: sha1(severity|workflow|step_file|section-slug)[:7]. -->
|
|
237
|
+
<!-- Also applied as a label so maintainers can filter all variants server-side. -->
|
|
238
|
+
|
|
239
|
+
## Finding
|
|
240
|
+
<!-- ONE sentence. What is the problem? Do not explain why yet. -->
|
|
241
|
+
{e.g. Step-05 forbids writes to `skills/` but does not name a staging directory.}
|
|
242
|
+
|
|
243
|
+
## Expected
|
|
244
|
+
<!-- ONE sentence. What did the step instruct or imply should happen? -->
|
|
245
|
+
{e.g. The step should name the staging directory between assembly and final write.}
|
|
246
|
+
|
|
247
|
+
## Actual
|
|
248
|
+
<!-- ONE sentence. What did you observe instead? -->
|
|
249
|
+
{e.g. No staging path specified, so artifacts were written to `skills/{name}/` and step-07 had to reorganize them.}
|
|
250
|
+
|
|
251
|
+
## Evidence
|
|
252
|
+
<!-- Bulleted `file:line` citations. 2-5 bullets. No narrative prose. -->
|
|
253
|
+
- `path/to/file.md:17` — "quoted text from the file"
|
|
254
|
+
- `path/to/other.md:62` — brief note on what it shows
|
|
255
|
+
|
|
256
|
+
## Impact
|
|
257
|
+
<!-- ONE sentence. What did this cost in THIS session? -->
|
|
258
|
+
{e.g. 50KB of artifacts written to the wrong path; step-07 required a file-move pass.}
|
|
259
|
+
|
|
260
|
+
## Suggested Fix
|
|
261
|
+
<!-- ONE recommended change. 1-3 sentences. Do NOT list multiple options here. -->
|
|
262
|
+
{e.g. Add a rule to step-05 naming `_bmad-output/{skill-name}/` as the staging directory used by step-06 validation.}
|
|
263
|
+
|
|
264
|
+
<details>
|
|
265
|
+
<summary>Alternatives considered (optional)</summary>
|
|
266
|
+
|
|
267
|
+
<!-- Only fill this if you seriously considered 2+ approaches. Keep under 100 words total. -->
|
|
268
|
+
|
|
269
|
+
</details>
|
|
270
|
+
|
|
271
|
+
## Environment
|
|
272
|
+
| Field | Value |
|
|
273
|
+
|-------|-------|
|
|
274
|
+
| Date | {ISO date} |
|
|
275
|
+
| OS | {e.g. macOS 15.2, Ubuntu 24.04, Windows 11} |
|
|
276
|
+
| AI Editor | {e.g. Claude Code, Cursor, Windsurf} |
|
|
277
|
+
| Model | {e.g. Claude Opus 4.6, Claude Sonnet 4.6} |
|
|
278
|
+
| Forge Tier | {Quick/Forge/Forge+/Deep, else N/A} |
|
|
279
|
+
| SKF Version | {from `{project-root}/_bmad/skf/VERSION`, else N/A} |
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
After creating all issues, display:
|
|
283
|
+
|
|
284
|
+
"**{N} issue(s) created on {healthCheckRepo}:**
|
|
285
|
+
{list each issue URL}
|
|
286
|
+
|
|
287
|
+
Workflow complete."
|
|
288
|
+
|
|
289
|
+
### 5b. On success, update the seen-cache
|
|
290
|
+
|
|
291
|
+
After each successful `gh issue create`, append to `{seenCachePath}`:
|
|
292
|
+
|
|
293
|
+
```json
|
|
294
|
+
{
|
|
295
|
+
"fp-XXXXXXX": {
|
|
296
|
+
"issue_url": "https://github.com/.../issues/123",
|
|
297
|
+
"action": "created",
|
|
298
|
+
"date": "YYYY-MM-DD"
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Ensure the parent directory exists. This file is global across the user's machine — not per-project — so the same defect is never re-reported across different repos the user works in.
|
|
304
|
+
|
|
305
|
+
### 5c. Local-Queue Path (gh unavailable OR friction/gap default)
|
|
306
|
+
|
|
307
|
+
For findings that didn't go live (gh unavailable, user declined the friction/gap opt-in, or user chose **\[S]** at the dedup gate), write a local file to `{localFallbackFolder}/`:
|
|
308
|
+
|
|
309
|
+
**Filename:** `hc-{workflow}-{timestamp}.md` (one file per finding, timestamp as YYYYMMDD-HHmmss)
|
|
310
|
+
|
|
311
|
+
**File content:** Same structured format as the issue body above, with YAML frontmatter:
|
|
312
|
+
|
|
313
|
+
```yaml
|
|
314
|
+
---
|
|
315
|
+
type: workflow-health-finding
|
|
316
|
+
workflow: {workflow name}
|
|
317
|
+
step_file: {step file path}
|
|
318
|
+
severity: {bug | friction | gap}
|
|
319
|
+
fingerprint: {fp-XXXXXXX}
|
|
320
|
+
date: {ISO date}
|
|
321
|
+
---
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
After writing all files, display:
|
|
325
|
+
|
|
326
|
+
"**{N} finding(s) saved locally:**
|
|
327
|
+
{list each file path}
|
|
328
|
+
|
|
329
|
+
GitHub CLI is not available. To submit these as issues, run:
|
|
330
|
+
`gh issue create --repo {healthCheckRepo} --title \"[title]\" --body-file {file-path}`
|
|
331
|
+
|
|
332
|
+
Or open them manually at: <https://github.com/{healthCheckRepo}/issues/new/choose>
|
|
333
|
+
|
|
334
|
+
Workflow complete."
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## CRITICAL STEP COMPLETION NOTE
|
|
339
|
+
|
|
340
|
+
This is the TERMINAL step — shared across all SKF workflows. After the health check completes (clean run or findings submitted/discarded), the workflow is fully done. No further steps to load.
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## SYSTEM SUCCESS/FAILURE METRICS
|
|
345
|
+
|
|
346
|
+
### SUCCESS:
|
|
347
|
+
|
|
348
|
+
- Clean runs exit immediately with no findings (most common outcome)
|
|
349
|
+
- Findings cite specific step files and sections with real evidence
|
|
350
|
+
- User review gate presented before any submission
|
|
351
|
+
- Severity gate respected: only `bug` submits live by default; `friction`/`gap` require explicit opt-in
|
|
352
|
+
- Fingerprint computed deterministically and applied to both title prefix and `fp-*` label
|
|
353
|
+
- `fp-*` label is ensured idempotently (`gh label create ... || true`) before `gh issue create`, so a first reporter of a defect never hard-fails
|
|
354
|
+
- Remote dedup search performed before every live submission; existing issues get reactions/delta-comments rather than duplicates
|
|
355
|
+
- Seen-cache at `{seenCachePath}` updated after every submission/reaction and consulted before every search
|
|
356
|
+
- Local fallback files written with clear manual submission instructions (when `gh` unavailable)
|
|
357
|
+
- Workflow ends cleanly
|
|
358
|
+
|
|
359
|
+
### SYSTEM FAILURE:
|
|
360
|
+
|
|
361
|
+
- Fabricating issues that were not actually encountered during the session
|
|
362
|
+
- Reporting vague issues without step file citations ("the workflow was confusing")
|
|
363
|
+
- Skipping the user review gate
|
|
364
|
+
- Creating issues without user confirmation
|
|
365
|
+
- Creating a new issue when a matching `fp-*` open issue already exists (without explicit user \[N] override)
|
|
366
|
+
- Submitting `friction` or `gap` findings live without the explicit severity-gate opt-in
|
|
367
|
+
- Using LLM-judged "similarity" in place of the deterministic fingerprint
|
|
368
|
+
- Not updating the seen-cache, causing the same user to re-report identical fingerprints
|
|
369
|
+
- Not providing the local fallback when `gh` is unavailable
|
|
370
|
+
- Continuing to load steps after this one (this is terminal)
|
|
371
|
+
|
|
372
|
+
**Master Rule:** Honesty is the only policy. Zero findings is the expected, healthy outcome. Fabricating issues to appear thorough undermines the entire self-improvement system and constitutes SYSTEM FAILURE.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Feasibility Report Schema
|
|
2
|
+
|
|
3
|
+
**Purpose:** Canonical contract shared between `skf-create-stack-skill` (consumer) and `skf-verify-stack` (producer). Any change here must be applied to both skills in lockstep.
|
|
4
|
+
|
|
5
|
+
## Filename
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
{forge_data_folder}/feasibility-report-{project_slug}-{YYYYMMDD-HHmmss}.md
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`{project_slug}` is the slugified `project_name` (lowercase, hyphens only, no unicode). A stable `feasibility-report-{project_slug}-latest.md` copy (not symlink) is written next to the timestamped file for pipeline consumers.
|
|
12
|
+
|
|
13
|
+
## Frontmatter (required)
|
|
14
|
+
|
|
15
|
+
```yaml
|
|
16
|
+
---
|
|
17
|
+
schemaVersion: "1.0"
|
|
18
|
+
reportType: feasibility
|
|
19
|
+
projectName: "{project_name}"
|
|
20
|
+
projectSlug: "{project_slug}"
|
|
21
|
+
generatedAt: "{ISO-8601 UTC}"
|
|
22
|
+
generatedBy: skf-verify-stack
|
|
23
|
+
overallVerdict: "FEASIBLE|CONDITIONALLY_FEASIBLE|NOT_FEASIBLE"
|
|
24
|
+
coveragePercentage: <0..100 integer>
|
|
25
|
+
pairsVerified: <non-negative integer>
|
|
26
|
+
pairsPlausible: <non-negative integer>
|
|
27
|
+
pairsRisky: <non-negative integer>
|
|
28
|
+
pairsBlocked: <non-negative integer>
|
|
29
|
+
recommendationCount: <non-negative integer>
|
|
30
|
+
prdAvailable: <true|false>
|
|
31
|
+
---
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Unknown `schemaVersion` MUST fail loudly in consumers — never silently proceed.** Consumers check `schemaVersion == "1.0"` and emit an explicit error if mismatched.
|
|
35
|
+
|
|
36
|
+
## Per-pair verdict tokens (case-sensitive)
|
|
37
|
+
|
|
38
|
+
Exactly one of:
|
|
39
|
+
|
|
40
|
+
| Token | Meaning | Required evidence |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `Verified` | All compatibility checks pass with declared evidence in both skills | Documentation cross-reference (Check 4) MUST pass with literal substring/name citation; language + protocol + type checks all pass |
|
|
43
|
+
| `Plausible` | Checks pass but at least one relies on inferred rather than declared evidence | Language + protocol + type checks pass; Check 4 weak or missing |
|
|
44
|
+
| `Risky` | At least one check produced incompatibility that a workaround may resolve | Any single check fails; workaround cited in recommendation |
|
|
45
|
+
| `Blocked` | Fundamental incompatibility that cannot be worked around | Language mismatch, protocol mismatch with no bridge, or type mismatch with no adapter |
|
|
46
|
+
|
|
47
|
+
## Overall verdict tokens (case-sensitive)
|
|
48
|
+
|
|
49
|
+
Exactly one of `FEASIBLE`, `CONDITIONALLY_FEASIBLE`, `NOT_FEASIBLE`.
|
|
50
|
+
|
|
51
|
+
- `FEASIBLE` — 100% coverage AND zero Blocked pairs AND zero pairs with Check 4 missing.
|
|
52
|
+
- `NOT_FEASIBLE` — Any Blocked pair OR zero coverage.
|
|
53
|
+
- `CONDITIONALLY_FEASIBLE` — Everything else.
|
|
54
|
+
|
|
55
|
+
## Body section headings (required, in order)
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
## Executive Summary
|
|
59
|
+
## Coverage Analysis
|
|
60
|
+
## Integration Verdicts
|
|
61
|
+
## Recommendations
|
|
62
|
+
## Evidence Sources
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Consumers grep for `## Integration Verdicts` to locate the pair table. The table header is fixed:
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
| lib_a | lib_b | verdict | rationale |
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Producer obligations (skf-verify-stack)
|
|
72
|
+
|
|
73
|
+
- Set `schemaVersion: "1.0"` in frontmatter.
|
|
74
|
+
- Never emit a verdict token outside the defined set.
|
|
75
|
+
- When Check 4 (documentation cross-reference) produces weak/missing evidence, cap the per-pair verdict at `Plausible`.
|
|
76
|
+
- When `coveragePercentage == 0`, force `overallVerdict: NOT_FEASIBLE` regardless of pair results.
|
|
77
|
+
|
|
78
|
+
## Consumer obligations (skf-create-stack-skill)
|
|
79
|
+
|
|
80
|
+
- Verify `schemaVersion == "1.0"`; halt with explicit error on mismatch.
|
|
81
|
+
- Treat any unknown verdict token as a hard error (do not silently drop or map).
|
|
82
|
+
- Use filename pattern above when referencing prior reports.
|
|
83
|
+
|
|
84
|
+
## Versioning policy
|
|
85
|
+
|
|
86
|
+
Any change to the verdict token set, frontmatter keys, or section headers is a schema-breaking change and MUST bump `schemaVersion`. Additive changes (new optional frontmatter keys) bump the minor version; breaking changes bump the major version.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Headless Gate Convention
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Gates are user interaction points where a workflow pauses for confirmation or input. In headless mode, gates auto-resolve with their default action. This convention ensures one code path with two behaviors — interactive and headless use the same gates, the same output, and the same progression logic.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
Every gate in a step file follows this pattern:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
**GATE: [default action]** — Present [options] to user.
|
|
13
|
+
If `{headless_mode}`: auto-proceed with [default action], log: "headless: auto-[action]".
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The gate always:
|
|
17
|
+
1. Prepares the same output (summary, preview, menu) regardless of mode
|
|
18
|
+
2. In interactive mode: displays the output and waits for user input
|
|
19
|
+
3. In headless mode: displays the output, logs the auto-action, and proceeds with the default
|
|
20
|
+
|
|
21
|
+
## Resolving `{headless_mode}`
|
|
22
|
+
|
|
23
|
+
`{headless_mode}` is resolved during activation from:
|
|
24
|
+
1. **Args:** `--headless` or `-H` passed to the skill invocation
|
|
25
|
+
2. **Preferences:** `headless_mode: true` in `{sidecar_path}/preferences.yaml`
|
|
26
|
+
3. **Default:** `false`
|
|
27
|
+
|
|
28
|
+
Each workflow's On Activation section resolves this variable alongside other config. The forger passes it through when dispatching to workflows.
|
|
29
|
+
|
|
30
|
+
## Gate Types
|
|
31
|
+
|
|
32
|
+
### Confirm Gate (default: Continue)
|
|
33
|
+
The most common gate. Presents a summary and asks to continue.
|
|
34
|
+
- Default action: `[C] Continue`
|
|
35
|
+
- Headless behavior: auto-continue after displaying summary
|
|
36
|
+
|
|
37
|
+
### Review Gate (default: Approve)
|
|
38
|
+
Presents compiled output for review before writing.
|
|
39
|
+
- Default action: `[C] Continue` (approve)
|
|
40
|
+
- Headless behavior: auto-approve after displaying preview
|
|
41
|
+
|
|
42
|
+
### Input Gate (default: use provided args)
|
|
43
|
+
Requires user-supplied data (skill name, path, etc.).
|
|
44
|
+
- Default action: use `{headless_args}` if provided
|
|
45
|
+
- Headless behavior: consume pre-supplied arguments; halt if missing required input
|
|
46
|
+
|
|
47
|
+
### Choice Gate (default: first safe option)
|
|
48
|
+
Presents a menu with multiple options (P/I/A, etc.).
|
|
49
|
+
- Default action: varies per gate (documented in step file)
|
|
50
|
+
- Headless behavior: auto-select the default, log the choice
|
|
51
|
+
|
|
52
|
+
## Headless Args
|
|
53
|
+
|
|
54
|
+
For skills that require user input (skill name, target path, etc.), headless mode accepts arguments via the invocation. Each skill's Invocation Contract documents its required headless args.
|
|
55
|
+
|
|
56
|
+
Example: `@Ferris QS cocoindex --headless` passes `cocoindex` as the target and skips all gates.
|
|
57
|
+
|
|
58
|
+
## What Headless Does NOT Skip
|
|
59
|
+
|
|
60
|
+
- Error halts (hard halts on missing files, invalid state)
|
|
61
|
+
- Progress output (summaries, status updates still display)
|
|
62
|
+
- Quality thresholds (if a step produces output below spec, it still reports the issue)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Output Contract Schema
|
|
2
|
+
|
|
3
|
+
Every pipeline-capable skill writes a result JSON file at its final step. This enables reliable CI integration and pipeline chaining.
|
|
4
|
+
|
|
5
|
+
## Schema
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"skill": "skf-skill-name",
|
|
10
|
+
"status": "success" | "failed" | "partial",
|
|
11
|
+
"timestamp": "ISO-8601",
|
|
12
|
+
"outputs": [
|
|
13
|
+
{"type": "report|skill|manifest|config", "path": "relative/path/to/file"}
|
|
14
|
+
],
|
|
15
|
+
"summary": {
|
|
16
|
+
// skill-specific summary fields
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Filenames
|
|
22
|
+
|
|
23
|
+
Each run writes **two files** to `{output_dir}`:
|
|
24
|
+
|
|
25
|
+
1. **Per-run record** (audit trail): `{skill-name}-result-{YYYYMMDD-HHmmss}.json`
|
|
26
|
+
- Timestamp is UTC, resolution to seconds — e.g., `update-skill-result-20260413-145230.json`
|
|
27
|
+
- Never overwritten by subsequent runs — preserves a durable audit trail across retries, aborts, and re-runs
|
|
28
|
+
2. **Stable latest pointer** (pipeline consumption): `{skill-name}-result-latest.json`
|
|
29
|
+
- A **copy** (not a symlink) of the per-run record just written
|
|
30
|
+
- Always present at a deterministic path so CI / pipelines / the forger can read `summary.*` without enumerating timestamps
|
|
31
|
+
- Overwritten on every successful write
|
|
32
|
+
|
|
33
|
+
Write the per-run record first, then copy it to the `-latest.json` path. If the copy fails, the per-run record still exists — the run is not lost.
|
|
34
|
+
|
|
35
|
+
**Consumers (forger, CI, chained workflows):** read from `{skill-name}-result-latest.json`. Do not enumerate timestamped files unless inspecting prior-run history.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Pipeline Contracts
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Pipelines chain multiple SKF workflows in sequence. The forger orchestrates the chain, passing data between workflows via filesystem artifacts and validating output contracts at each transition.
|
|
6
|
+
|
|
7
|
+
## Syntax
|
|
8
|
+
|
|
9
|
+
The forger recognizes pipeline invocations when the user provides multiple workflow codes:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
AN CS TS EX — space-separated codes
|
|
13
|
+
AN -> CS -> TS -> EX — arrow-separated (equivalent)
|
|
14
|
+
BS CS[cocoindex] TS EX — with target argument in brackets
|
|
15
|
+
CS TS[min:80] EX — with circuit breaker threshold
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The forger also accepts common pipeline aliases:
|
|
19
|
+
|
|
20
|
+
| Alias | Expands To | Description |
|
|
21
|
+
|-------|-----------|-------------|
|
|
22
|
+
| `forge` | `BS CS TS EX` | Full skill creation pipeline (brief through export) |
|
|
23
|
+
| `forge-quick` | `QS TS EX` | Quick skill pipeline |
|
|
24
|
+
| `onboard` | `AN CS TS EX` | Full brownfield onboarding (AN generates briefs, CS consumes them directly) |
|
|
25
|
+
| `maintain` | `AS US TS EX` | Maintenance cycle (audit → update → test → export) |
|
|
26
|
+
|
|
27
|
+
## Pipeline Rules
|
|
28
|
+
|
|
29
|
+
1. **Left to right execution** — each workflow completes before the next begins
|
|
30
|
+
2. **Headless implied** — pipelines activate `{headless_mode}` automatically for all workflows in the chain (the user already committed to the sequence)
|
|
31
|
+
3. **Data forwarding** — the forger resolves output-to-input mapping between adjacent workflows (see Data Flow table)
|
|
32
|
+
4. **Circuit breakers** — if a workflow's output fails its quality check, the pipeline halts with a summary of what completed and what remains
|
|
33
|
+
5. **Error halts propagate** — if any workflow hard-halts, the pipeline stops immediately
|
|
34
|
+
6. **Progress reporting** — the forger reports completion of each workflow before starting the next
|
|
35
|
+
|
|
36
|
+
## Data Flow
|
|
37
|
+
|
|
38
|
+
How outputs from one workflow become inputs to the next:
|
|
39
|
+
|
|
40
|
+
| From | To | Data Passed | How |
|
|
41
|
+
|------|-----|------------|-----|
|
|
42
|
+
| AN | CS | `skill-brief.yaml` paths from generated briefs | Forger passes each `brief_path` written by AN to CS; in batch mode, CS processes all sequentially |
|
|
43
|
+
| BS | CS | `skill-brief.yaml` path | Forger passes the brief path written by BS as `brief_path` to CS |
|
|
44
|
+
| CS | TS | skill name (derived from brief) | Forger passes the `skill_name` from the completed CS to TS |
|
|
45
|
+
| CS | EX | skill name | Same — forger resolves the created skill's name |
|
|
46
|
+
| TS | EX | skill name + test result | Forger checks `result` field in test report; if FAIL and circuit breaker active, halts |
|
|
47
|
+
| QS | TS | skill name (from `repo_name`) | Forger passes the quick-skill's output name to TS |
|
|
48
|
+
| QS | EX | skill name | Same |
|
|
49
|
+
| AS | US | skill name + drift severity | Forger checks `summary.severity` in `audit-skill-result-latest.json`; if CLEAN, skips US |
|
|
50
|
+
| VS | RA | architecture doc path | Already known from VS invocation |
|
|
51
|
+
|
|
52
|
+
## Circuit Breakers
|
|
53
|
+
|
|
54
|
+
Circuit breakers halt the pipeline when a workflow's output doesn't meet a quality threshold:
|
|
55
|
+
|
|
56
|
+
| Workflow | Check | Default Threshold | Halt Condition |
|
|
57
|
+
|----------|-------|-------------------|----------------|
|
|
58
|
+
| AN | recommended units count | min: 1 | Zero skillable units found |
|
|
59
|
+
| CS | compilation success | must complete | Hard error during compilation |
|
|
60
|
+
| TS | completeness score | min: 60 | Score below threshold |
|
|
61
|
+
| AS | drift score | not CRITICAL | Critical drift found |
|
|
62
|
+
| VS | feasibility verdict | not BLOCKED | All integrations blocked |
|
|
63
|
+
|
|
64
|
+
Override syntax: `TS[min:80]` sets the test-skill threshold to 80 for this pipeline run.
|
|
65
|
+
|
|
66
|
+
### Bracket Syntax
|
|
67
|
+
|
|
68
|
+
Brackets after a workflow code (`CODE[value]`) are parsed as follows:
|
|
69
|
+
|
|
70
|
+
- **Circuit breaker override**: `min:N` where N is a number — e.g., `TS[min:80]` sets the threshold for that workflow
|
|
71
|
+
- **Target argument**: any other value — e.g., `CS[cocoindex]` passes "cocoindex" as the target to CS
|
|
72
|
+
|
|
73
|
+
Only workflows with a circuit breaker entry (AN, CS, TS, AS, VS) accept `min:N` overrides. All other workflows ignore `min:N` brackets. Target arguments are valid for any workflow that accepts a named input (CS, QS, BS, US, etc.).
|
|
74
|
+
|
|
75
|
+
## Pipeline State
|
|
76
|
+
|
|
77
|
+
The forger tracks pipeline state in memory during execution:
|
|
78
|
+
|
|
79
|
+
```yaml
|
|
80
|
+
pipeline:
|
|
81
|
+
workflows: [AN, CS, TS, EX]
|
|
82
|
+
current_index: 1
|
|
83
|
+
completed:
|
|
84
|
+
- {code: AN, status: ok, output: {units: 3, briefs: [...]}}
|
|
85
|
+
pending: [CS, TS, EX]
|
|
86
|
+
data:
|
|
87
|
+
skill_name: "cocoindex"
|
|
88
|
+
brief_path: "/path/to/skill-brief.yaml"
|
|
89
|
+
target: "cocoindex"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Anti-Patterns
|
|
93
|
+
|
|
94
|
+
The forger validates the pipeline sequence and warns about:
|
|
95
|
+
|
|
96
|
+
| Pattern | Issue | Suggestion |
|
|
97
|
+
|---------|-------|------------|
|
|
98
|
+
| EX before TS | Exporting untested skill | Add TS before EX |
|
|
99
|
+
| US without AS | Updating without audit | Run AS first to detect what changed |
|
|
100
|
+
| CS without BS or AN | Compiling without brief | Need a brief — use QS for quick path, or AN for brownfield |
|
|
101
|
+
| TS after EX | Testing after export | Move TS before EX |
|
|
102
|
+
| Duplicate codes | Same workflow twice | Remove duplicate |
|