bmad-module-skill-forge 4.0.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.md +3 -3
  3. package/docs/_data/pinned.yaml +19 -13
  4. package/docs/agents.md +1 -1
  5. package/docs/architecture.md +5 -5
  6. package/docs/campaign.md +1 -1
  7. package/docs/concepts.md +4 -4
  8. package/docs/examples.md +32 -25
  9. package/docs/getting-started.md +3 -3
  10. package/docs/how-it-works.md +2 -2
  11. package/docs/index.md +1 -1
  12. package/docs/skill-model.md +41 -39
  13. package/docs/troubleshooting.md +9 -3
  14. package/docs/verifying-a-skill.md +42 -21
  15. package/docs/why-skf.md +1 -1
  16. package/docs/workflows.md +6 -6
  17. package/package.json +1 -1
  18. package/src/knowledge/tool-resolution.md +6 -6
  19. package/src/shared/references/headless-gate-convention.md +4 -1
  20. package/src/shared/references/output-contract-schema.md +3 -3
  21. package/src/shared/references/pipeline-contracts.md +2 -1
  22. package/src/shared/scripts/schemas/skf-test-result-envelope.v1.json +1 -1
  23. package/src/shared/scripts/schemas/skf-update-result-envelope.v1.json +11 -3
  24. package/src/shared/scripts/schemas/skill-brief.v1.json +1 -1
  25. package/src/shared/scripts/skf-build-change-manifest.py +1180 -189
  26. package/src/shared/scripts/skf-classify-changed-files.py +15 -10
  27. package/src/shared/scripts/skf-count-tokens.py +54 -10
  28. package/src/shared/scripts/skf-detect-workspaces.py +67 -0
  29. package/src/shared/scripts/skf-emit-result-envelope.py +64 -20
  30. package/src/shared/scripts/skf-extract-public-api.py +472 -120
  31. package/src/shared/scripts/skf-extraction-inventory.py +10 -6
  32. package/src/shared/scripts/skf-extraction-snapshot.py +6 -6
  33. package/src/shared/scripts/skf-parse-gaps.py +136 -26
  34. package/src/shared/scripts/skf-render-metadata-stats.py +1 -1
  35. package/src/shared/scripts/skf-resolve-customization.py +197 -0
  36. package/src/shared/scripts/skf-shard-body.py +239 -41
  37. package/src/shared/scripts/skf-validate-output.py +12 -3
  38. package/src/shared/scripts/skf-verify-provenance-completeness.py +574 -45
  39. package/src/shared/tool-requirements.yaml +8 -2
  40. package/src/skf-analyze-source/SKILL.md +3 -2
  41. package/src/skf-analyze-source/assets/skill-brief-schema.md +1 -1
  42. package/src/skf-analyze-source/references/generate-briefs.md +1 -1
  43. package/src/skf-analyze-source/references/headless-contract.md +1 -1
  44. package/src/skf-audit-skill/SKILL.md +4 -3
  45. package/src/skf-audit-skill/references/re-index.md +2 -2
  46. package/src/skf-audit-skill/references/report.md +1 -1
  47. package/src/skf-brief-skill/SKILL.md +3 -2
  48. package/src/skf-brief-skill/assets/skill-brief-schema.md +2 -2
  49. package/src/skf-brief-skill/references/invocation-contract.md +2 -2
  50. package/src/skf-brief-skill/references/scope-definition.md +4 -4
  51. package/src/skf-campaign/SKILL.md +3 -2
  52. package/src/skf-campaign/references/campaign-contracts.md +2 -0
  53. package/src/skf-campaign/references/step-05-skill-loop.md +8 -3
  54. package/src/skf-campaign/references/step-10-export.md +3 -2
  55. package/src/skf-create-skill/SKILL.md +4 -3
  56. package/src/skf-create-skill/assets/skill-sections.md +1 -1
  57. package/src/skf-create-skill/references/ccc-index-check.md +1 -1
  58. package/src/skf-create-skill/references/component-extraction.md +1 -1
  59. package/src/skf-create-skill/references/extract.md +3 -2
  60. package/src/skf-create-skill/references/extraction-patterns.md +3 -3
  61. package/src/skf-create-skill/references/generate-artifacts.md +1 -1
  62. package/src/skf-create-skill/references/report.md +8 -3
  63. package/src/skf-create-skill/references/sub/ccc-discover.md +1 -1
  64. package/src/skf-create-skill/references/validate.md +1 -1
  65. package/src/skf-create-stack-skill/SKILL.md +3 -2
  66. package/src/skf-create-stack-skill/references/generate-output.md +1 -1
  67. package/src/skf-create-stack-skill/references/invocation-contract.md +1 -1
  68. package/src/skf-create-stack-skill/references/parallel-extract.md +2 -2
  69. package/src/skf-create-stack-skill/references/report.md +1 -1
  70. package/src/skf-create-stack-skill/references/validate.md +1 -1
  71. package/src/skf-drop-skill/SKILL.md +3 -2
  72. package/src/skf-drop-skill/references/invocation-contract.md +1 -1
  73. package/src/skf-drop-skill/references/report.md +1 -1
  74. package/src/skf-export-skill/SKILL.md +3 -2
  75. package/src/skf-export-skill/assets/snippet-format.md +5 -5
  76. package/src/skf-export-skill/references/generate-snippet.md +22 -15
  77. package/src/skf-export-skill/references/invocation-contract.md +1 -1
  78. package/src/skf-export-skill/references/load-skill.md +1 -1
  79. package/src/skf-export-skill/references/summary.md +1 -1
  80. package/src/skf-export-skill/references/token-report.md +29 -9
  81. package/src/skf-forger/SKILL.md +3 -2
  82. package/src/skf-forger/references/pipeline-mode.md +2 -2
  83. package/src/skf-quick-skill/SKILL.md +4 -3
  84. package/src/skf-quick-skill/references/finalize.md +1 -1
  85. package/src/skf-quick-skill/references/halt-contract.md +2 -2
  86. package/src/skf-quick-skill/references/write-and-validate.md +1 -1
  87. package/src/skf-refine-architecture/SKILL.md +8 -9
  88. package/src/skf-refine-architecture/customize.toml +1 -1
  89. package/src/skf-refine-architecture/references/report.md +1 -1
  90. package/src/skf-rename-skill/SKILL.md +3 -2
  91. package/src/skf-rename-skill/references/invocation-contract.md +2 -2
  92. package/src/skf-setup/SKILL.md +3 -2
  93. package/src/skf-setup/references/ccc-index.md +1 -1
  94. package/src/skf-setup/references/invocation-contract.md +1 -1
  95. package/src/skf-test-skill/SKILL.md +3 -2
  96. package/src/skf-test-skill/assets/output-section-formats.md +6 -4
  97. package/src/skf-test-skill/references/coherence-check.md +11 -8
  98. package/src/skf-test-skill/references/coverage-check-branches.md +81 -0
  99. package/src/skf-test-skill/references/coverage-check-tiers.md +3 -3
  100. package/src/skf-test-skill/references/coverage-check.md +60 -97
  101. package/src/skf-test-skill/references/init.md +2 -1
  102. package/src/skf-test-skill/references/inventory-contract.md +27 -0
  103. package/src/skf-test-skill/references/invocation-contract.md +3 -3
  104. package/src/skf-test-skill/references/migration-section-rules.md +26 -14
  105. package/src/skf-test-skill/references/report.md +5 -5
  106. package/src/skf-test-skill/references/scoring-rules.md +8 -7
  107. package/src/skf-test-skill/references/signature-comparison-rules.md +72 -0
  108. package/src/skf-test-skill/references/source-access-protocol.md +14 -10
  109. package/src/skf-test-skill/references/step-hard-gate.md +1 -0
  110. package/src/skf-test-skill/scripts/build-result-context.py +20 -3
  111. package/src/skf-test-skill/scripts/gap-ledger.py +456 -176
  112. package/src/skf-test-skill/scripts/load-coverage-inputs.py +516 -79
  113. package/src/skf-test-skill/scripts/locate-export-segments.py +685 -76
  114. package/src/skf-test-skill/scripts/reconcile-coverage.py +192 -39
  115. package/src/skf-test-skill/scripts/score-signatures.py +1205 -65
  116. package/src/skf-test-skill/scripts/stage-helper-payload.py +64 -13
  117. package/src/skf-test-skill/scripts/validate-inventory.py +350 -35
  118. package/src/skf-test-skill/templates/test-report-template.md +1 -0
  119. package/src/skf-update-skill/SKILL.md +3 -2
  120. package/src/skf-update-skill/references/detect-changes.md +1 -1
  121. package/src/skf-update-skill/references/gap-driven.md +54 -33
  122. package/src/skf-update-skill/references/invocation-contract.md +1 -1
  123. package/src/skf-update-skill/references/merge.md +15 -10
  124. package/src/skf-update-skill/references/re-extract.md +3 -1
  125. package/src/skf-update-skill/references/report.md +6 -5
  126. package/src/skf-update-skill/references/write.md +42 -20
  127. package/src/skf-verify-stack/SKILL.md +4 -3
  128. package/tools/cli/lib/tool-check.js +158 -2
@@ -30,7 +30,7 @@
30
30
  "name": "skill-forge",
31
31
  "source": "./",
32
32
  "description": "Evidence-based agent skills compiler with progressive capability tiers (Quick/Forge/Forge+/Deep).",
33
- "version": "4.0.0",
33
+ "version": "6.0.0",
34
34
  "author": {
35
35
  "name": "Armel"
36
36
  },
package/README.md CHANGED
@@ -52,15 +52,15 @@ results = cognee.search("What does Cognee do?", mode="graph")
52
52
  import cognee
53
53
 
54
54
  # Agent follows the skill instruction:
55
- # `search(query_text: str, query_type: SearchType = GRAPH_COMPLETION) -> List[SearchResult]`
56
- # [AST:cognee/api/v1/search/search.py:L27]
55
+ # `search(query_text: str, query_type: SearchType = SearchType.HYBRID_COMPLETION, ...) -> list[SearchResult]`
56
+ # [AST:cognee/api/v1/search/search.py:L41]
57
57
  results = await cognee.search(
58
58
  query_text="What does Cognee do?",
59
59
  query_type=cognee.SearchType.GRAPH_COMPLETION
60
60
  )
61
61
  ```
62
62
 
63
- The skill told the agent the real function name, the real parameters, and that the call is async, all traced to the exact source line. This example is from the real [`oms-cognee`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/SKILL.md) skill in [**oh-my-skills**](https://github.com/armelhbobdad/oh-my-skills), SKF's reference output. That skill predates provenance labels that follow the tool: its provenance map records `search` as read by eye, which SKF 3.0.0 cites as `[SRC:...]`, keeping `[AST:...]` for a definition an ast-grep rule matched. The [**Verifying a Skill**](#verifying-a-skill) section below shows how to walk the citation chain yourself.
63
+ The skill told the agent the real function name, the real parameters, and that the call is async, all traced to the exact source line. This example is from the real [`oms-cognee`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.6.2/oms-cognee/SKILL.md) skill in [**oh-my-skills**](https://github.com/armelhbobdad/oh-my-skills), SKF's reference output. Its provenance map records `search` as an ast-grep match at that line, which is what `[AST:...]` means; an export SKF reads by eye instead is cited `[SRC:...]`. The [**Verifying a Skill**](#verifying-a-skill) section below shows how to walk the citation chain yourself.
64
64
 
65
65
  ## Install
66
66
 
@@ -32,7 +32,7 @@
32
32
  # Enforced two ways: (1) release.yaml bumps this line in the same commit
33
33
  # as package.json + marketplace.json on every release; (2) validate-docs-drift.js
34
34
  # cross-checks this value against package.json.version and fails on mismatch.
35
- skf_version: "4.0.0"
35
+ skf_version: "6.0.0"
36
36
 
37
37
  # Path to the oh-my-skills repo, resolved relative to this repo's root.
38
38
  # Override at runtime with the OMS environment variable if oh-my-skills
@@ -46,12 +46,13 @@ oh_my_skills_path: "../oh-my-skills"
46
46
  skills:
47
47
  oms-cognee:
48
48
  library: cognee
49
- version: "1.0.0"
49
+ version: "1.6.2"
50
50
  source_repo: "https://github.com/topoteretes/cognee"
51
- source_commit: "3c048aa4147776f14d4546704f986242554a9ef3"
52
- source_ref: "v1.0.0"
53
- upstream_commit_date: "2026-04-11"
54
- test_score: 99.00
51
+ source_commit: "ba3631f2ed363a6ea50d649c34c56885af6b36fe"
52
+ source_ref: "v1.6.2"
53
+ upstream_commit_date: "2026-09-29"
54
+ # strict SKF 4.0.0 re-test of the version that ships (20261103T134151Z-12e5ccdf)
55
+ test_score: 99.0
55
56
  test_mode: "naive"
56
57
  confidence_tier: "Deep"
57
58
  source_authority: "community"
@@ -59,12 +60,13 @@ skills:
59
60
 
60
61
  oms-cocoindex:
61
62
  library: cocoindex
62
- version: "0.3.37"
63
+ version: "1.0.0"
63
64
  source_repo: "https://github.com/cocoindex-io/cocoindex"
64
- source_commit: "87c5dbf087bfccca83791861db0d33519ef09677"
65
- source_ref: "v0.3.37"
66
- upstream_commit_date: "2026-03-31"
67
- test_score: 99.0
65
+ source_commit: "5fe4f37a526e51516655832ec9814e7ca24ade9a"
66
+ source_ref: "v1.0.0"
67
+ upstream_commit_date: "2026-04-22"
68
+ # strict SKF 4.0.0 re-test of the version that ships (20261103T131524Z-5907fba9)
69
+ test_score: 100.0
68
70
  test_mode: "naive"
69
71
  confidence_tier: "Deep"
70
72
  source_authority: "community"
@@ -77,7 +79,9 @@ skills:
77
79
  source_commit: "e486d3826bcd40c52db1c766966d1c8ec16df6cb"
78
80
  source_ref: "v10.3.5"
79
81
  upstream_commit_date: "2026-04-07"
80
- test_score: 99.49
82
+ # null: the strict SKF 4.0.0 re-test of the version that ships
83
+ # (20261103T131516Z-6e2b972a) is blocked by the hard gate, so it records no score.
84
+ test_score: null
81
85
  test_mode: "naive"
82
86
  confidence_tier: "Deep"
83
87
  source_authority: "community"
@@ -90,7 +94,9 @@ skills:
90
94
  source_commit: "a5ffb45be05335d2c547436664cfbfb8c22d04df"
91
95
  source_ref: "HEAD"
92
96
  upstream_commit_date: "2026-03-22"
93
- test_score: 99.45
97
+ # null: the strict SKF 4.0.0 report (20261103T100001Z-981f84e6) is
98
+ # blocked by the hard gate, so it records no score.
99
+ test_score: null
94
100
  test_mode: "naive"
95
101
  confidence_tier: "Deep"
96
102
  source_authority: "community"
package/docs/agents.md CHANGED
@@ -77,4 +77,4 @@ Ferris can run several workflows in one command. Type their codes in order, such
77
77
  `campaign` is not a chaining alias. It is a separate workflow (`@Ferris CA` or `@Ferris campaign`) that runs its own pipeline for many skills, builds them in the order their dependencies need, and can resume where it stopped. `CA` cannot be chained with other codes. See the [Campaign](/docs/campaign.md) page.
78
78
 
79
79
  **Memory:**
80
- Ferris keeps a memory folder, called the sidecar, at `_bmad/_memory/forger-sidecar/`, so he remembers your setup between sessions. It holds `forge-tier.yaml` (the tools Setup Forge found and your capability tier), `preferences.yaml` (your settings) and the result of your last pipeline run (`pipeline-result-latest.json`). A pipeline keeps its progress in a journal in its own run folder under `_bmad-output/.skf-run/`. If one stopped partway, Ferris reads that journal the next time you open him and offers to resume it, or to repair it first after a failed test, and you can tell him to drop the offer. A start with `--headless` (or `-H`) that names no code, alias or chain stops with "Nothing to run". In `preferences.yaml`, set `headless_mode: true` to make headless the default, or `compact_greeting: true` to get a short greeting without the full menu table (ask for the menu when you want it). [Getting Started → Configuration](/docs/getting-started.md#configuration) lists more preferences.
80
+ Ferris keeps a memory folder, called the sidecar, at `_bmad/_memory/forger-sidecar/`, so he remembers your setup between sessions. It holds `forge-tier.yaml` (the tools Setup Forge found and your capability tier), `preferences.yaml` (your settings) and the result of the last pipeline run that reached its end (`pipeline-result-latest.json`; a chain cut off before it ends writes none, so the file can be an earlier chain's). A pipeline keeps its progress in a journal in its own run folder under `_bmad-output/.skf-run/`. If one stopped partway, Ferris reads that journal the next time you open him and offers to resume it, or to repair it first after a failed test, and you can tell him to drop the offer. A start with `--headless` (or `-H`) that names no code, alias or chain stops with "Nothing to run". In `preferences.yaml`, set `headless_mode: true` to make headless the default, or `compact_greeting: true` to get a short greeting without the full menu table (ask for the menu when you want it). [Getting Started → Configuration](/docs/getting-started.md#configuration) lists more preferences.
@@ -22,7 +22,7 @@ A workflow directory holds some or all of these files, and each has a specific j
22
22
  | File | What it does | When it loads |
23
23
  |---------------------------|---------------------------------------------------------------------------------------------------------------------|---------------------------------------------------|
24
24
  | `SKILL.md` | Human-readable entry point: goals, role definition, initialization sequence, invocation contract, and the route to the first step | Entry point per workflow |
25
- | `customize.toml` | Settings a team or a person can override without editing SKF, such as facts to keep in mind for the whole run or a command to run when the workflow ends. Overrides go in `_bmad/custom/<workflow>.toml` (shared) or `_bmad/custom/<workflow>.user.toml` (personal), for example `_bmad/custom/skf-create-skill.toml`. The workflow reads them by running BMAD Method's customization script, which the BMAD Method installer adds, through `uv`. When that script cannot run, as with SKF installed alone, the workflow prints one warning, adds `customization_resolver_unavailable` to the run's warnings (an interactive Export Skill run only prints it) and applies the bundled settings | Read once, when the workflow starts |
25
+ | `customize.toml` | Settings a team or a person can override without editing SKF, such as facts to keep in mind for the whole run or a command to run when the workflow ends. Overrides go in `_bmad/custom/<workflow>.toml` (shared) or `_bmad/custom/<workflow>.user.toml` (personal), for example `_bmad/custom/skf-create-skill.toml`. The workflow reads them by running SKF's customization helper through `uv`, which runs BMAD Method's customization script, added by the BMAD Method installer. When that script cannot run, as with SKF installed alone, the workflow prints one warning, adds `customization_resolver_unavailable` to the run's warnings (an interactive Export Skill run only prints it) and applies the bundled settings | Read once, when the workflow starts |
26
26
  | `references/*.md` (step files) | The workflow's stages, one file per step. Each names the next one in its `nextStepFile` front matter, and the last one hands off to the shared health check | One at a time (just-in-time) |
27
27
  | `references/*.md` (reference data) | Workflow-specific reference data: rules, patterns, protocols | Read by steps on demand |
28
28
  | `assets/*.md` | Workflow-specific output formats: schemas, templates, heuristics | Read by steps on demand |
@@ -55,9 +55,9 @@ flowchart LR
55
55
 
56
56
  1. **Trigger**: You type `@Ferris CS` (or a close match like `create-skill`). The menu in `skf-forger/SKILL.md` maps the code to the workflow's skill, here `skf-create-skill`.
57
57
  2. **Agent loads**: `skf-forger/SKILL.md` puts the persona (identity, principles, critical actions) into the context window. Ferris also loads its sidecar files (`forge-tier.yaml`, `preferences.yaml`), which keep your tier and preferences between sessions.
58
- 3. **Workflow loads**: The workflow's `SKILL.md` loads your SKF settings from `_bmad/skf/config.yaml` and checks whether the run is headless (runs without asking questions). It then runs BMAD Method's customization script through `uv` to apply any team or personal overrides to the workflow's `customize.toml`, as Ferris does for his own settings when he starts. When that script cannot run (with SKF installed alone it is missing), the workflow prints one warning, adds `customization_resolver_unavailable` to the run's warnings (an interactive Export Skill run only prints it) and keeps the bundled settings. Then it opens the first step file.
58
+ 3. **Workflow loads**: The workflow's `SKILL.md` loads your SKF settings from `_bmad/skf/config.yaml` and checks whether the run is headless (runs without asking questions). It then runs SKF's customization helper through `uv`, which runs BMAD Method's customization script to apply any team or personal overrides to the workflow's `customize.toml`, as Ferris does for his own settings when he starts. When that script cannot run (with SKF installed alone it is missing), the workflow prints one warning, adds `customization_resolver_unavailable` to the run's warnings (an interactive Export Skill run only prints it) and keeps the bundled settings. Then it opens the first step file.
59
59
  4. **Step-by-step execution**: Only the current step file is in context (just-in-time loading). Each step names the next one. The assistant reads the step, carries it out, saves its output, then loads the next step. Future steps are never loaded early.
60
- 5. **Sub-agent delegation**: Some steps would otherwise read many large files, such as several `SKILL.md` documents or every file that imports a library. These steps hand the reading to sub-agents, which are helper AI sessions started with the Agent tool. Each sub-agent reads its share and returns a short JSON summary. The parent never loads the full text, so the next step starts with an uncluttered context window. AN (per-unit analysis), TS (coverage and coherence checks), VS (integration verification), RA (gap analysis) and SS (per-library extraction) work this way. VS and RA run at most 8 sub-agents at a time. SS runs 3 to 5 at a time in Claude Code.
60
+ 5. **Sub-agent delegation**: Some steps would otherwise read many large files, such as several `SKILL.md` documents or every file that imports a library. These steps hand the reading to sub-agents, which are helper AI sessions started with the Agent tool. Each sub-agent reads its share and returns a short JSON summary, and the step waits in the foreground until every one has returned, since a headless `claude -p` run stops when the agent's turn ends. The parent never loads the full text, so the next step starts with an uncluttered context window. AN (per-unit analysis), TS (coverage and coherence checks), VS (integration verification), RA (gap analysis) and SS (per-library extraction) work this way. VS and RA run at most 8 sub-agents at a time. SS runs 3 to 5 at a time in Claude Code.
61
61
  6. **Knowledge injection**: Steps consult `skf-knowledge-index.csv` and load only the fragments from `knowledge/` that match by tags and relevance. Cross-cutting principles (zero hallucination, confidence tiers, provenance) load only when a step asks for them, never in advance.
62
62
  7. **Reference and asset injection**: Steps read `references/*.md` and `assets/*.md` files as needed (rules, patterns, schemas, heuristics). This is deliberate: only the data the current step needs enters the context window.
63
63
  8. **Script execution**: Steps run deterministic Python scripts (`scripts/*.py`, `shared/scripts/*.py`), usually with `uv run`, for work that must be reproducible: scoring, structural diffing, manifest operations, frontmatter validation. The assistant prepares the inputs, the script computes, and the assistant uses the output. The same inputs always give the same result.
@@ -143,14 +143,14 @@ forge-data/{skill-name}/
143
143
  ├── test-findings-{run_id}.json # Test Skill's gap ledger, which its hard gate reads
144
144
  ├── drift-report-{timestamp}.md # Written by Audit Skill
145
145
  ├── .skf-audit/{timestamp}/ # The JSON each audit scored its drift from
146
- └── {workflow}-result-latest.json # Machine-readable result of the last run
146
+ └── {workflow}-result-latest.json # Machine-readable result of the last run whose emitter wrote this copy
147
147
  ```
148
148
 
149
149
  The `provenance-map.json` includes per-export `entries` with a `source_library` field naming the library each export belongs to. For stack skills, it also includes an `integrations` array (cross-library patterns) and, in compose mode only, a `constituents` array. That array records a fingerprint (hash) of each source skill's `metadata.json` at compose time, so Audit Skill can tell when a source skill has changed since. The `file_entries` array tracks copied scripts and assets file by file (SHA-256 hashes, source paths).
150
150
 
151
151
  ### Pipeline Result Contracts
152
152
 
153
- Pipeline-facing workflows write a machine-readable result JSON file alongside their human-readable output. This makes CI checks and chained runs reliable: a later workflow or script can check what the earlier step produced without parsing Markdown. Each run writes two files. The first is a timestamped record, `{workflow}-result-{YYYYMMDD-HHmmss}.json`, which keeps the full history across retries and aborts. The second is a copy named `{workflow}-result-latest.json`, which other tools read without sorting through timestamps. `{workflow}` names the workflow, not the skill being built. Most workflows leave off the `skf-` prefix (`create-skill`, `update-skill`), but Test Skill keeps it. Its record is `skf-test-skill-result-{YYYYMMDD-HHmmss}.json` (UTC, with `-2` appended when a run already took that second's name), no longer named after the run ID. The files sit next to what the run produced. For Create, Update, Test and Audit Skill, that is the skill's version folder in `forge-data/`. When Ferris runs a chain of workflows, he keeps its state in a journal, `pipeline-journal.json`, in the chain's run folder under `_bmad-output/.skf-run/`, and when the chain ends he writes its result from that journal: `pipeline-result-<YYYYMMDD-HHmmss>.json` and its `pipeline-result-latest.json` copy in his sidecar folder. The schema follows a consistent format: `skill`, `status` (success/failed/partial), `timestamp`, `outputs` (array of produced artifacts with type and path), and a skill-specific `summary` object.
153
+ Pipeline-facing workflows write a machine-readable result JSON file alongside their human-readable output. This makes CI checks and chained runs reliable: a later workflow or script can check what the earlier step produced without parsing Markdown. Each run writes two files. The first is a timestamped record, `{workflow}-result-{YYYYMMDD-HHmmss}.json`, which keeps the full history across retries and aborts. The second is a copy named `{workflow}-result-latest.json`, the record of the last run whose emitter wrote this copy, which other tools read without sorting through timestamps. A caller that started a run reads that run's own result line instead: a run cut off before its emitter call printed none and wrote no record, so the copy then belongs to an earlier run. `{workflow}` names the workflow, not the skill being built. Most workflows leave off the `skf-` prefix (`create-skill`, `update-skill`), but Test Skill keeps it. Its record is `skf-test-skill-result-{YYYYMMDD-HHmmss}.json` (UTC, with `-2` appended when a run already took that second's name), no longer named after the run ID. The files sit next to what the run produced. For Create, Update, Test and Audit Skill, that is the skill's version folder in `forge-data/`. When Ferris runs a chain of workflows, he keeps its state in a journal, `pipeline-journal.json`, in the chain's run folder under `_bmad-output/.skf-run/`, and when the chain ends he writes its result from that journal: `pipeline-result-<YYYYMMDD-HHmmss>.json` and its `pipeline-result-latest.json` copy in his sidecar folder. A chain cut off before it ends writes none, so the copy can be an earlier chain's. The schema follows a consistent format: `skill`, `status` (success/failed/partial), `timestamp`, `outputs` (array of produced artifacts with type and path), and a skill-specific `summary` object.
154
154
 
155
155
  `skills/` and `forge-data/` are committed. Agent memory (`_bmad/_memory/forger-sidecar/`) is gitignored.
156
156
 
package/docs/campaign.md CHANGED
@@ -186,7 +186,7 @@ A finished campaign leaves:
186
186
  - **Verification report and refined architecture**: from Verification and Refinement, when an architecture document was found.
187
187
  - **Campaign report** (`campaign-report.md`): the quality gate; a table of every skill with its tier, status, score, pin and workarounds; an Export Gate section with each completed skill's verdict, whether Export exported it or why its export failed, and the skills the gate kept from export; the lowest, highest and average scores; time per skill; and a section on failed or skipped skills.
188
188
  - **Decision log** (`_campaign-decision-log.md`): every decision made during the campaign.
189
- - **Headless result line** (`SKF_CAMPAIGN_RESULT_JSON`): printed in headless mode for scripts to read, as the run's last line. Besides the counts and the score of each skill, it carries `export_verdicts` (each completed skill's verdict at Export), `skills_excluded` (the completed skills the gate kept from export), `skills_exported` (the skills Export exported) and `export_failures` (each skill whose export failed, with its `halt_reason` and `exit_code`). The last two are null when the Export stage did not run. A failed export does not fail the campaign, which still ends with `status` `success`, so a CI job that needs every skill exported checks `export_failures`.
189
+ - **Headless result line** (`SKF_CAMPAIGN_RESULT_JSON`): printed in headless mode for scripts to read, as the run's last line. Besides the counts and the score of each skill, it carries `export_verdicts` (each completed skill's verdict at Export), `skills_excluded` (the completed skills the gate kept from export), `skills_exported` (the skills Export exported) and `export_failures` (each skill whose export failed, with its `halt_reason` and `exit_code`). The last two are null when the Export stage did not run. An `export_failures` entry's `exit_code` is null when the export printed no line (its `halt_reason` is then `no-result`) or one Campaign could not read (`result-unreadable`). A failed export does not fail the campaign, which still ends with `status` `success`, so a CI job that needs every skill exported checks `export_failures`.
190
190
 
191
191
  The Export stage (stage 9) asks before it writes anything. It lists each completed skill with its verdict, names the skills it leaves out because they fall below the soft fallback or have no score, and waits for `[E]xport all` or `[C]ancel`. `[E]xport all` exports only the `pass` and `fallback` skills, each under the skill folder its build wrote: a Tier B skill under the name Quick Skill gave it, the library's name, even when you named the target differently. In headless mode it exports them without asking.
192
192
 
package/docs/concepts.md CHANGED
@@ -15,7 +15,7 @@ An agent skill is an instruction file that tells an AI agent how to use your cod
15
15
 
16
16
  Skills follow the [agentskills.io](https://agentskills.io) open standard, so they work across Claude, Cursor, Copilot, and other AI tools.
17
17
 
18
- **Example:** A skill for [cognee](https://github.com/topoteretes/cognee) tells your agent: "The function is `cognee.search()`, its first parameters are `query_text`, `query_type`, `user`, `datasets`, and `dataset_ids`, and it's defined at `cognee/api/v1/search/search.py:L27` (v1.0.0, commit `3c048aa4`)." With ast-grep installed, SKF reads such a signature from the structure of the actual source code (its abstract syntax tree, or AST) and labels it T1; a signature it reads by eye instead is labeled T1-low (see [Confidence Tiers](#confidence-tiers-t1t1-lowt2t3)).
18
+ **Example:** A skill for [cognee](https://github.com/topoteretes/cognee) tells your agent: "The function is `cognee.search()`, its first parameters are `query_text`, `query_type`, `user`, `datasets`, and `dataset_ids`, and it's defined at `cognee/api/v1/search/search.py:L41` (v1.6.2, commit `ba3631f2`)." With ast-grep installed, SKF reads such a signature from the structure of the actual source code (its abstract syntax tree, or AST) and labels it T1; a signature it reads by eye instead is labeled T1-low (see [Confidence Tiers](#confidence-tiers-t1t1-lowt2t3)).
19
19
 
20
20
  ---
21
21
 
@@ -24,8 +24,8 @@ Skills follow the [agentskills.io](https://agentskills.io) open standard, so the
24
24
  Provenance means every instruction in a skill traces back to where it came from. For code, that's a file and line number. For documentation, it's a URL. For developer discourse such as issues, pull requests, and changelogs, it's the indexed document the instruction came from. **If SKF can't point to a source, it doesn't include the instruction.**
25
25
 
26
26
  **Examples** (the citation forms, with paths from the oms-cognee skill in [oh-my-skills](https://github.com/armelhbobdad/oh-my-skills)):
27
- - `[AST:cognee/api/v1/search/search.py:L27]`: an ast-grep rule matched the definition in the source code (T1)
28
- - `[SRC:cognee/api/v1/add/add.py:L166]`: read from source code by eye, without an ast-grep match (T1-low)
27
+ - `[AST:cognee/api/v1/search/search.py:L41]`: an ast-grep rule matched the definition in the source code (T1)
28
+ - `[SRC:cognee/api/v1/__init__.py:L8]`: read from source code by eye, without an ast-grep match (T1-low)
29
29
  - `[QMD:oms-cognee-temporal:releases.md]`: found in indexed release notes and other developer discourse (T2)
30
30
  - `[EXT:https://docs.cognee.ai/getting-started/quickstart]`: taken from external documentation (T3)
31
31
 
@@ -79,7 +79,7 @@ Audit Skill also checks the documentation pages a skill tracked when it was buil
79
79
 
80
80
  Every skill records the exact version (or commit) of the source code it was built from. This means you always know which version of the library the instructions apply to.
81
81
 
82
- By default, the version is auto-detected from the source (package.json, pyproject.toml, etc.). You can also target a specific version, either by giving it during `@Ferris BS` (Brief Skill) or by adding `@version` to a Quick Skill command (`@Ferris QS cognee@1.0.0`). This is especially useful for docs-only skills, where there is no source code to detect a version from. When you target a version on a remote repository, SKF finds the matching git tag and clones from it. That way the extracted API signatures come from that version's code, not from whatever is on the default branch with a label added. If no tag matches, Quick Skill stops and lists the tags it found, while Create Skill warns you and falls back to the default branch.
82
+ By default, the version is auto-detected from the source (package.json, pyproject.toml, etc.). You can also target a specific version, either by giving it during `@Ferris BS` (Brief Skill) or by adding `@version` to a Quick Skill command (`@Ferris QS cognee@1.6.2`). This is especially useful for docs-only skills, where there is no source code to detect a version from. When you target a version on a remote repository, SKF finds the matching git tag and clones from it. That way the extracted API signatures come from that version's code, not from whatever is on the default branch with a label added. If no tag matches, Quick Skill stops and lists the tags it found, while Create Skill warns you and falls back to the default branch.
83
83
 
84
84
  When the source updates, re-run `@Ferris US` (Update Skill) to regenerate the skill. SKF writes the result as a new version and leaves the old one in place. Anything you wrote between `<!-- [MANUAL:name] -->` and `<!-- [/MANUAL:name] -->` markers is carried over; edits made anywhere else are not protected and can be overwritten. Update Skill follows the ref the skill was built from, so a skill built from a branch picks up that branch's new commits. To move a skill built from a release tag to a newer release, run `@Ferris US <name> --target-ref <tag>`.
85
85
 
package/docs/examples.md CHANGED
@@ -5,25 +5,26 @@ description: Real-world scenarios and operational tips for Skill Forge. For comm
5
5
 
6
6
  ## What the Output Looks Like
7
7
 
8
- When SKF generates a skill, you get a `SKILL.md` file with machine-readable frontmatter and provenance-backed instructions. Below is a trimmed example from the real [`oms-cognee` SKILL.md](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/SKILL.md) generated for [cognee](https://github.com/topoteretes/cognee) (full portfolio at [oh-my-skills](https://github.com/armelhbobdad/oh-my-skills)):
8
+ When SKF generates a skill, you get a `SKILL.md` file with machine-readable frontmatter and provenance-backed instructions. Below is a trimmed example from the real [`oms-cognee` SKILL.md](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.6.2/oms-cognee/SKILL.md) generated for [cognee](https://github.com/topoteretes/cognee) (full portfolio at [oh-my-skills](https://github.com/armelhbobdad/oh-my-skills)):
9
9
 
10
10
  **Frontmatter (tells AI agents when to load this skill):**
11
11
 
12
12
  ```yaml
13
13
  name: oms-cognee
14
14
  description: >
15
- Builds apps on top of cognee v1.0.0, the knowledge-graph memory engine for AI agents.
16
- Use when ingesting text/files/URLs into persistent memory, building knowledge graphs,
17
- searching graph-backed memory with multiple SearchType modes, enriching graphs with
18
- memify/improve, scoping memory with datasets and node_sets, configuring LLM/embedding/
19
- graph/vector backends, running custom task pipelines, tracing operations, decorating
20
- agent entrypoints with `agent_memory`, connecting to Cognee Cloud with `serve`, or
21
- visualizing the graph. Covers cognee/__init__.py exports: the V1 API (add, cognify,
22
- search, memify, datasets, prune, update, run_custom_pipeline, config, SearchType,
23
- visualize_graph, pipelines, Drop, run_startup_migrations, tracing) and the V2
24
- memory-oriented API (remember, RememberResult, recall, improve, forget, serve,
25
- disconnect, visualize, agent_memory). Do NOT use for: cognee internals, the HTTP
26
- REST API (use cognee-mcp or the FastAPI server), non-cognee memory/RAG libraries.
15
+ Builds apps on cognee v1.6.2, the knowledge-graph memory engine for AI agents.
16
+ Use when ingesting text/files/URLs into memory, building knowledge graphs, searching
17
+ memory with SearchType modes, enriching graphs with memify/improve, scoping memory
18
+ with datasets and node_sets, configuring LLM/embedding/graph/vector backends,
19
+ running custom pipelines, decorating agents with `agent_memory`, connecting
20
+ to Cognee Cloud with `serve`/`push`, exporting, validating or reporting on graphs,
21
+ or visualizing graphs and memory provenance. Covers cognee/__init__.py exports: the
22
+ V1 API (add, cognify, search, memify, datasets, agents, prune, update,
23
+ run_custom_pipeline, config, SearchType, report, validate, visualize_graph,
24
+ pipelines, Drop, run_migrations, tracing, tools) and the V2 memory API (remember,
25
+ recall, improve, forget, serve, disconnect, visualize, push, export, agent_memory,
26
+ MemoryEntry). Do NOT use for: cognee internals, the HTTP REST API (use
27
+ cognee-mcp or the FastAPI server), non-cognee memory/RAG libraries.
27
28
  ```
28
29
 
29
30
  **Body (what your AI agent reads):**
@@ -33,15 +34,15 @@ description: >
33
34
 
34
35
  | Function | Purpose | Key Params | Source |
35
36
  |----------|---------|------------|--------|
36
- | add() | Ingest text, files, binary data | data, dataset_name | [AST:cognee/api/v1/add/add.py:L22] |
37
- | cognify() | Build knowledge graph | datasets, graph_model | [AST:cognee/api/v1/cognify/cognify.py:L44] |
38
- | search() | Query knowledge graph | query_text, query_type | [AST:cognee/api/v1/search/search.py:L27] |
39
- | memify() | Enrich graph with custom tasks | extraction_tasks, data | [AST:cognee/modules/memify/memify.py:L25] |
40
- | remember() | V2 one-shot memory ingest | data, dataset_name | [AST:cognee/api/v1/remember/remember.py:L339] |
41
- | DataPoint | Base class for custom graph nodes | inherit and add fields | [EXT:docs.cognee.ai/guides/custom-data-models] |
37
+ | add() | Ingest text, files, binary data | data, dataset_name | [AST:cognee/api/v1/add/add.py:L39] |
38
+ | cognify() | Build knowledge graph | datasets, graph_model | [AST:cognee/api/v1/cognify/cognify.py:L110] |
39
+ | search() | Query knowledge graph | query_text, query_type | [AST:cognee/api/v1/search/search.py:L41] |
40
+ | memify() | Enrich graph with custom tasks | extraction_tasks, data | [AST:cognee/modules/memify/memify.py:L27] |
41
+ | remember() | V2 one-shot memory ingest | data, dataset_name | [AST:cognee/api/v1/remember/remember.py:L867] |
42
+ | DataPoint | Base class for custom graph nodes | inherit and add fields | [SRC:cognee/low_level.py:L2] |
42
43
  ```
43
44
 
44
- Every line number above is copied from the real SKILL.md and points at the line where that function is defined in the cognee source, so none of it is illustrative. SKF also ships its extraction record for this skill in oh-my-skills: [`forge-data/oms-cognee/1.0.0/provenance-map.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-cognee/1.0.0/provenance-map.json). The tags are copied as published too, and they predate labels that follow the tool: that record lists these functions as read by eye (`source-read`), so SKF 3.0.0 would tag them `[SRC:...]` (T1-low) and keep `[AST:...]` for a definition an ast-grep rule matched. [Verifying a Skill](/docs/verifying-a-skill.md#2-open-the-skills-provenance-mapjson) walks through the `search` entry.
45
+ Every line number above is copied from the real SKILL.md and points at the line where that function is defined in the cognee source, so none of it is illustrative. SKF also ships its extraction record for this skill in oh-my-skills: [`forge-data/oms-cognee/1.6.2/provenance-map.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/forge-data/oms-cognee/1.6.2/provenance-map.json). The tags follow the tool that read each definition: that record lists the five functions as ast-grep matches (`T1`), so the skill cites them `[AST:...]`, while `DataPoint` is an alias that `cognee/low_level.py` re-binds, read by eye and cited `[SRC:...]` (`T1-low`). [Verifying a Skill](/docs/verifying-a-skill.md#2-open-the-skills-provenance-mapjson) walks through the `search` entry.
45
46
 
46
47
  Provenance tags trace each instruction to its source:
47
48
  - `[AST:file:Lnn]` (T1): an ast-grep rule matched the definition in the code (highest confidence)
@@ -55,16 +56,22 @@ See [Skill Model → Output Architecture](/docs/skill-model.md#output-architectu
55
56
 
56
57
  ```
57
58
  skills/oms-cognee/
58
- ├── active -> 1.0.0
59
+ ├── active -> 1.6.2
59
60
  ├── 0.5.8/
60
61
  │ └── oms-cognee/
61
62
  │ ├── SKILL.md # Archived: v0.5.8, pinned to b51dcce1
62
63
  │ ├── context-snippet.md
63
64
  │ ├── metadata.json
64
65
  │ └── references/
65
- └── 1.0.0/
66
+ ├── 1.0.0/
67
+ │ └── oms-cognee/
68
+ │ ├── SKILL.md # Archived: v1.0.0, pinned to 3c048aa4
69
+ │ ├── context-snippet.md
70
+ │ ├── metadata.json
71
+ │ └── references/
72
+ └── 1.6.2/
66
73
  └── oms-cognee/
67
- ├── SKILL.md # Active: pinned to cognee v1.0.0 (3c048aa4)
74
+ ├── SKILL.md # Active: pinned to cognee v1.6.2 (ba3631f2)
68
75
  ├── context-snippet.md # Compressed index for platform context files
69
76
  ├── metadata.json # Machine-readable provenance
70
77
  └── references/ # Progressive disclosure detail
@@ -74,7 +81,7 @@ skills/oms-cognee/
74
81
  └── pipelines-and-datapoints.md
75
82
  ```
76
83
 
77
- This is the real directory listing from [`oh-my-skills/skills/oms-cognee/`](https://github.com/armelhbobdad/oh-my-skills/tree/main/skills/oms-cognee) after cognee shipped v1.0.0 upstream. SKF recompiled the skill from the v1.0.0 commit and wrote it next to the existing 0.5.8 tree. The older version stays pinned to its original commit (`b51dcce1`) and is still installable by any project that hasn't bumped its `CLAUDE.md` pin yet. The `active` symlink and the [`.export-manifest.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/.export-manifest.json) both point at the current version. Some skills also include `scripts/` and `assets/` directories when the source repository contains executable scripts or static assets. oms-cognee has neither; see [Skill Model → Per-Skill Output](/docs/skill-model.md#per-skill-output) for the full schema.
84
+ This is the real directory listing from [`oh-my-skills/skills/oms-cognee/`](https://github.com/armelhbobdad/oh-my-skills/tree/main/skills/oms-cognee) after cognee shipped v1.0.0 and then v1.6.2 upstream. Each time SKF recompiled the skill from the new commit and wrote it next to the existing trees. The older versions stay pinned to their original commits (`b51dcce1`, `3c048aa4`) and are still installable by any project that hasn't bumped its `CLAUDE.md` pin yet. The `active` symlink and the [`.export-manifest.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/.export-manifest.json) both point at the current version. Some skills also include `scripts/` and `assets/` directories when the source repository contains executable scripts or static assets. oms-cognee has neither; see [Skill Model → Per-Skill Output](/docs/skill-model.md#per-skill-output) for the full schema.
78
85
 
79
86
  ---
80
87
 
@@ -93,7 +100,7 @@ Ferris reads the repository, lists its public exports, and validates against the
93
100
  Need a specific version? Append `@version`:
94
101
 
95
102
  ```
96
- @Ferris QS cognee@1.0.0
103
+ @Ferris QS cognee@1.6.2
97
104
  ```
98
105
 
99
106
  ### Brownfield Platform: Pipeline or per-workflow
@@ -8,7 +8,7 @@ description: Install Skill Forge and generate your first verified skill in under
8
8
  One command. One verified skill. Here's what an instruction in a cognee skill looks like:
9
9
 
10
10
  ```python
11
- await cognee.search( # [AST:cognee/api/v1/search/search.py:L27]
11
+ await cognee.search( # [AST:cognee/api/v1/search/search.py:L41]
12
12
  query_text="What does Cognee do?"
13
13
  )
14
14
  ```
@@ -93,7 +93,7 @@ After a successful `install` or `update`, and in `status`, the installer checks
93
93
  ccc - optional, Forge+ tier https://github.com/cocoindex-io/cocoindex-code
94
94
  ```
95
95
 
96
- Each tool reads `ok`, `upgrade to >= <minimum>` with the command that upgrades it, `missing` or `optional` with where to get it, or `installed, version unknown` when SKF cannot read its version. The minimums are the ones in the [Prerequisites](#prerequisites-full-reference) table. The check waits at most about 3 seconds for the tools to answer and never changes the command's exit code. It runs no tool from your project folder and never runs `npx`, so `tessl` and `skill-check`, which SKF runs through `npx`, read as optional when they are not installed.
96
+ Each tool reads `ok`, `upgrade to >= <minimum>` with the command that upgrades it, `missing` or `optional` with where to get it, or `installed, version unknown` when SKF cannot read its version. The minimums are the ones in the [Prerequisites](#prerequisites-full-reference) table. The check waits at most about 3 seconds for the tools to answer and never changes the command's exit code. It runs no tool from your project folder and never runs `npx`, so `tessl` and `skill-check`, which SKF runs through `npx`, read as optional when they are not installed. It never runs `tessl` or `skill-check`: on a tessl that has never run, any tessl command accepts tessl's Terms. It reads tessl's version from the name of the binary tessl installs, the one tessl's npm and Homebrew packages also run, and the version of `skill-check`, which has no `--version` option, from its installed package. An `@tessl/cli` before 0.63.0 is tessl itself, so its package gives the version. tessl reads `installed, version unknown` when it was installed with winget, pnpm or Volta, when an npm or Homebrew tessl's binary is not installed at `~/.local/bin/tessl` (`%LOCALAPPDATA%\tessl\bin\tessl.exe` on Windows), or when two files in tessl's `versions` folder have the size of the Windows copy, `tessl\bin\tessl.exe`. So does a `skill-check` installed with pnpm or Volta, or with yarn or bun on Windows.
97
97
 
98
98
  A tier tool below its minimum does not count toward your tier. With an ast-grep older than 0.45.3, `@Ferris SF` leaves you at Quick, whatever else you have installed. Setup's FORGE STATUS report then shows an upgrade line for the tool, and a headless setup adds a `tool_below_minimum` warning to its `SKF_SETUP_RESULT_JSON` envelope. Upgrade the tool and run `@Ferris SF` again. A tool with no minimum, or one whose version SKF cannot read, never lowers your tier.
99
99
 
@@ -129,7 +129,7 @@ Ferris reads the repository, extracts the public API, and generates a skill in u
129
129
 
130
130
  **Targeting a specific version:** Append `@version` to pin the skill to a library version:
131
131
  ```
132
- @Ferris QS cognee@1.0.0
132
+ @Ferris QS cognee@1.6.2
133
133
  ```
134
134
 
135
135
  **Full quality path (pipeline mode):**
@@ -23,7 +23,7 @@ In under a minute, plus one preview for you to approve, you get a `SKILL.md` you
23
23
 
24
24
  ### 2. The workflow resolves your target
25
25
 
26
- Ferris turns your input into a GitHub repository. A GitHub URL is used as given. A package name is looked up on every registry of npm, PyPI and crates.io (a language hint asks only that language's registry), with a web search as the last resort. When more than one registry answers, an interactive run lists every candidate and asks which project you mean, and a headless run keeps the first registry's pick (npm, then PyPI, then crates.io) and records an `also_found_in` warning in its result envelope. He then detects the main language from the repository's files, starting with its manifest (`pyproject.toml`, `package.json`, etc.). By default Quick Skill reads the repository's default branch. To pin a release, add it to the command (`@Ferris QS cognee@1.0.0`): Ferris checks that the matching git tag exists, stops if it doesn't, and reads everything from that tag.
26
+ Ferris turns your input into a GitHub repository. A GitHub URL is used as given. A package name is looked up on every registry of npm, PyPI and crates.io (a language hint asks only that language's registry), with a web search as the last resort. When more than one registry answers, an interactive run lists every candidate and asks which project you mean, and a headless run keeps the first registry's pick (npm, then PyPI, then crates.io) and records an `also_found_in` warning in its result envelope. He then detects the main language from the repository's files, starting with its manifest (`pyproject.toml`, `package.json`, etc.). By default Quick Skill reads the repository's default branch. To pin a release, add it to the command (`@Ferris QS cognee@1.6.2`): Ferris checks that the matching git tag exists, stops if it doesn't, and reads everything from that tag.
27
27
 
28
28
  Quick Skill has a step that checks for an official skill before it reads any code, but it skips that check until agentskills.io offers a registry API to ask, so Ferris goes straight on to extraction.
29
29
 
@@ -50,7 +50,7 @@ That's the whole pipeline. One trigger in, one reviewed skill out, built from co
50
50
  Quick Skill is the fastest path, not the most thorough one. When you want every instruction tied to a file and a line, use the brief-driven [`create-skill`](/docs/workflows.md#create-skill-cs) path instead: describe the skill's scope with `@Ferris BS`, which writes a `skill-brief.yaml`, then compile it with `@Ferris CS`. That path records the exact commit it read, and with ast-grep installed each export an ast-grep rule matches carries a receipt like this one:
51
51
 
52
52
  ```python
53
- await cognee.search( # [AST:cognee/api/v1/search/search.py:L27]
53
+ await cognee.search( # [AST:cognee/api/v1/search/search.py:L41]
54
54
  query_text="What does Cognee do?"
55
55
  )
56
56
  ```
package/docs/index.md CHANGED
@@ -26,7 +26,7 @@ Skill Forge reads a library's source code and docs and writes a skill: an instru
26
26
 
27
27
  <div class="receipt-sample">
28
28
  <span class="receipt-sample__label">An ast-grep receipt looks like</span>
29
- <code class="receipt-sample__chip">[AST:cognee/api/v1/search/search.py:L27]</code>
29
+ <code class="receipt-sample__chip">[AST:cognee/api/v1/search/search.py:L41]</code>
30
30
  <span class="receipt-sample__check" aria-label="verified">✓</span>
31
31
  </div>
32
32
 
@@ -187,25 +187,26 @@ Skills follow the [agentskills.io specification](https://agentskills.io/specific
187
187
  ---
188
188
  name: oms-cognee
189
189
  description: >
190
- Builds apps on top of cognee v1.0.0, the knowledge-graph memory engine for AI agents.
191
- Use when ingesting text/files/URLs into persistent memory, building knowledge graphs,
192
- searching graph-backed memory with multiple SearchType modes, enriching graphs with
193
- memify/improve, scoping memory with datasets and node_sets, configuring LLM/embedding/
194
- graph/vector backends, running custom task pipelines, tracing operations, decorating
195
- agent entrypoints with `agent_memory`, connecting to Cognee Cloud with `serve`, or
196
- visualizing the graph. Covers cognee/__init__.py exports: the V1 API (add, cognify,
197
- search, memify, datasets, prune, update, run_custom_pipeline, config, SearchType,
198
- visualize_graph, pipelines, Drop, run_startup_migrations, tracing) and the V2
199
- memory-oriented API (remember, RememberResult, recall, improve, forget, serve,
200
- disconnect, visualize, agent_memory). Do NOT use for: cognee internals, the HTTP
201
- REST API (use cognee-mcp or the FastAPI server), non-cognee memory/RAG libraries.
190
+ Builds apps on cognee v1.6.2, the knowledge-graph memory engine for AI agents.
191
+ Use when ingesting text/files/URLs into memory, building knowledge graphs, searching
192
+ memory with SearchType modes, enriching graphs with memify/improve, scoping memory
193
+ with datasets and node_sets, configuring LLM/embedding/graph/vector backends,
194
+ running custom pipelines, decorating agents with `agent_memory`, connecting
195
+ to Cognee Cloud with `serve`/`push`, exporting, validating or reporting on graphs,
196
+ or visualizing graphs and memory provenance. Covers cognee/__init__.py exports: the
197
+ V1 API (add, cognify, search, memify, datasets, agents, prune, update,
198
+ run_custom_pipeline, config, SearchType, report, validate, visualize_graph,
199
+ pipelines, Drop, run_migrations, tracing, tools) and the V2 memory API (remember,
200
+ recall, improve, forget, serve, disconnect, visualize, push, export, agent_memory,
201
+ MemoryEntry). Do NOT use for: cognee internals, the HTTP REST API (use
202
+ cognee-mcp or the FastAPI server), non-cognee memory/RAG libraries.
202
203
  ---
203
204
  ```
204
205
 
205
206
  Every instruction in the body traces to source, with a citation that names the tool that read it (`[AST:]` for an ast-grep match, `[SRC:]` for a read by eye):
206
207
 
207
208
  ```python
208
- await cognee.search( # [AST:cognee/api/v1/search/search.py:L27]
209
+ await cognee.search( # [AST:cognee/api/v1/search/search.py:L41]
209
210
  query_text="What does Cognee do?"
210
211
  )
211
212
  ```
@@ -214,44 +215,46 @@ await cognee.search( # [AST:cognee/api/v1/search/search.py:L27]
214
215
 
215
216
  Machine-readable provenance for every skill:
216
217
 
217
- This is a trimmed excerpt from the real [`oms-cognee/1.0.0/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/metadata.json) shipped with the oh-my-skills canonical output. Every value below is copied from the file, not made up for illustration.
218
+ This is a trimmed excerpt from the real [`oms-cognee/1.6.2/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.6.2/oms-cognee/metadata.json) shipped with the oh-my-skills canonical output. Every value below is copied from the file, not made up for illustration.
218
219
 
219
220
  ```json
220
221
  {
221
222
  "name": "oms-cognee",
222
- "version": "1.0.0",
223
+ "version": "1.6.2",
223
224
  "skill_type": "single",
224
225
  "source_authority": "community",
225
226
  "source_repo": "https://github.com/topoteretes/cognee",
226
- "source_commit": "3c048aa4",
227
- "source_ref": "v1.0.0",
227
+ "source_commit": "ba3631f2ed363a6ea50d649c34c56885af6b36fe",
228
+ "source_ref": "v1.6.2",
228
229
  "confidence_tier": "Deep",
229
230
  "spec_version": "1.3",
230
- "generation_date": "2026-04-13T00:00:00Z",
231
+ "generation_date": "2026-11-02T19:41:43Z",
231
232
  "language": "python",
232
- "ast_node_count": 34,
233
+ "ast_node_count": 42,
233
234
  "confidence_distribution": {
234
- "t1": 34,
235
- "t1_low": 0,
236
- "t2": 11,
237
- "t3": 15
235
+ "t1": 37,
236
+ "t1_low": 49,
237
+ "t2": 0,
238
+ "t3": 0
238
239
  },
239
240
  "stats": {
240
- "exports_documented": 34,
241
- "exports_public_api": 34,
242
- "exports_internal": 0,
243
- "exports_total": 34,
244
- "public_api_coverage": 1.0,
245
- "total_coverage": 1.0
241
+ "exports_documented": 86,
242
+ "exports_public_api": 102,
243
+ "exports_internal": 355,
244
+ "exports_total": 457,
245
+ "public_api_coverage": 0.8431,
246
+ "total_coverage": 0.1882,
247
+ "scripts_count": 0,
248
+ "assets_count": 0
246
249
  }
247
250
  }
248
251
  ```
249
252
 
250
- Fields omitted from this excerpt for brevity: `source_root`, `description`, `exports[]`, `tool_versions`, `dependencies`, `compatibility`, `generated_by`, and a `last_update` that an earlier SKF version wrote. Update Skill now records `last_update` and `update_type` at the top level of `provenance-map.json` in `forge-data/{name}/{version}/`, and an update removes both from `metadata.json`, which marks an update only in `generation_date`. The full 93-line file lives at [`oh-my-skills/skills/oms-cognee/1.0.0/oms-cognee/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.0.0/oms-cognee/metadata.json).
253
+ Fields omitted from this excerpt for brevity: `source_root`, `description`, `exports[]`, `tool_versions`, `dependencies`, `compatibility` and `generated_by`. Update Skill records `last_update` and `update_type` at the top level of `provenance-map.json` in `forge-data/{name}/{version}/`, and an update removes both from `metadata.json`, which marks an update only in `generation_date`. The full 146-line file lives at [`oh-my-skills/skills/oms-cognee/1.6.2/oms-cognee/metadata.json`](https://github.com/armelhbobdad/oh-my-skills/blob/main/skills/oms-cognee/1.6.2/oms-cognee/metadata.json).
251
254
 
252
- Two fields are easy to mix up. `confidence_tier` holds the forge tier a single skill like this one was compiled at (Quick, Forge, Forge+ or Deep). A stack skill records there the dominant confidence tier of its libraries (T1, T1-low, T2 or T3) and keeps its forge tier in `forge_tier`; Export Skill still accepts a forge tier from a stack made by an earlier SKF version, with a warning that running Stack Skill again records the dominant tier. `confidence_distribution` counts the claims at each confidence tier (T1, T1-low, T2, T3). In a stack it counts each library once, by the library's tier, so its bins sum to `library_count`.
255
+ Two fields are easy to mix up. `confidence_tier` holds the forge tier a single skill like this one was compiled at (Quick, Forge, Forge+ or Deep). A stack skill records there the dominant confidence tier of its libraries (T1, T1-low, T2 or T3) and keeps its forge tier in `forge_tier`; Export Skill still accepts a forge tier from a stack made by an earlier SKF version, with a warning that running Stack Skill again records the dominant tier. `confidence_distribution` counts each claim by the tier of its signature (`signature_source`: T1, T1-low, T2 or T3), which can be lower than the entry's `confidence` label. In a stack it counts each library once, by the library's tier, so its bins sum to `library_count`.
253
256
 
254
- The excerpt's `t1` count of 34 comes from an SKF version that labeled exports by the forge tier. This skill's provenance map records its exports as read by eye (`source-read`), which SKF 3.0.0 counts as `t1_low`: only an export an ast-grep rule matched counts as `t1` now, and `ast_node_count` counts only those exports.
257
+ Its counts follow the tool that read each export's signature: 37 exports whose signature an ast-grep rule matched count as `t1`, and 49 count as `t1_low`. Of those 49, 44 were read by eye (`source-read`), such as aliases, module namespaces and the names gap-driven repairs added. The other 5 were located by an ast-grep rule, but their signatures were read by eye, such as the methods of the `config` class. `ast_node_count` (42) counts every export an ast-grep rule matched. The skill's 1.0.0 metadata, written by an SKF version that labeled exports by the forge tier, counted all 34 of its exports as `t1`. `exports_documented` (86) is below `exports_public_api` (102): the brief leaves some top-level names out of scope, and the skill's test report lists them and logs the remaining difference as a Medium `metadata-drift` gap.
255
258
 
256
259
  `scripts` and `assets` arrays are optional: SKF leaves them out entirely, rather than writing empty arrays, when the source has no scripts or assets.
257
260
 
@@ -301,18 +304,17 @@ Export injects a managed section between markers:
301
304
  The block below is the real managed section currently in [`oh-my-skills/CLAUDE.md`](https://github.com/armelhbobdad/oh-my-skills/blob/main/CLAUDE.md), showing one of its four compiled skills. Every line is copied from the file except the last one before `<!-- SKF:END -->`, which stands in for the three skills left out:
302
305
 
303
306
  ```markdown
304
- <!-- SKF:BEGIN updated:2026-04-25 -->
307
+ <!-- SKF:BEGIN updated:2026-11-02 -->
305
308
  [SKF Skills]|4 skills|0 stack
306
309
  |IMPORTANT: Prefer documented APIs over training data.
307
310
  |When using a listed library, read its SKILL.md before writing code.
308
311
  |
309
- |[oms-cognee v1.0.0]|root: skills/oms-cognee/
310
- |IMPORTANT: oms-cognee v1.0.0 — read SKILL.md before writing cognee code. Do NOT rely on training data.
312
+ |[oms-cognee v1.6.2]|root: skills/oms-cognee/
313
+ |IMPORTANT: oms-cognee v1.6.2 — read SKILL.md before writing oms-cognee code. Do NOT rely on training data.
311
314
  |quick-start:SKILL.md#quick-start
312
- |api-v1: add(), cognify(), search(), memify(), update(), run_custom_pipeline(), visualize_graph(), datasets, prune, config, SearchType, pipelines, Drop, run_startup_migrations(), session, tracing
313
- |api-v2: remember()→RememberResult, recall(), improve(), forget(), serve()/disconnect(), visualize(), @agent_memory
314
- |key-types:SKILL.md#key-types — SearchType: GRAPH_COMPLETION (default), RAG_COMPLETION, CHUNKS, CHUNKS_LEXICAL, SUMMARIES, TEMPORAL, CODING_RULES, CYPHER, FEELING_LUCKY, GRAPH_COMPLETION_DECOMPOSITION (+5 more); Task, Drop, RememberResult, DataPoint, 5 Cognee* exceptions
315
- |gotchas: cognee.low_level REMOVED from public API in v1.0.0 (import from cognee.infrastructure.engine directly); cognee.run_migrations REPLACED by cognee.run_startup_migrations (relational + vector); cognee.delete is DEPRECATED since v0.3.9 (use cognee.datasets.delete_data or cognee.forget); cognee.pipelines restructured in v1.0.0 (package with Drop + lazy re-exports); cognee.agent_memory requires async function; cognee.serve() without url triggers Auth0 Device Code Flow; cognee.start_ui is sync and needs pid_callback arg; all add/cognify/search/memify/remember/recall/improve/forget/serve are async — always await.
315
+ |api: add(), cognify(), search(), memify(), remember(), recall(), improve(), forget(), serve(), run_migrations()
316
+ |key-types:SKILL.md#key-types — SearchType (20 modes, HYBRID_COMPLETION default), RememberResult, DataPoint, Drop
317
+ |gotchas: cognee.run_startup_migrations is GONE in v1.6.2 (AttributeError) — use cognee.run_migrations(); search() now defaults to HYBRID_COMPLETION (pin query_type when the result shape matters); low_level is not a top-level name but `from cognee.low_level import DataPoint, setup` still works; a bare cognee.serve() runs the Auth0 device flow only when a device client ID is configured, else raises CogneeConfigurationError; agent_memory's save_traces is now save_session_traces; cognee.delete is DEPRECATED since v0.3.9 (use cognee.forget or cognee.datasets.delete_data); cognee.start_ui is sync and needs pid_callback; add/cognify/search/memify/remember/recall/improve/forget/serve/push/export/report/validate are async — always await.
316
318
  |
317
319
  |(three more skills are left out here for brevity: oms-cocoindex, oms-storybook-react-vite and oms-uitripled; see the full file)
318
320
  <!-- SKF:END -->
@@ -53,7 +53,7 @@ When ccc is available (Forge+, or Deep with ccc), create-skill indexes the skill
53
53
 
54
54
  Surfaced by `@Ferris SF` when ccc is available and `ccc index` exits with an error: the forge status shows `indexing failed, semantic discovery unavailable this session` with ccc's own message. Setup still finishes at your tier; only semantic discovery is off until the index builds. One cause is an index that an older ccc wrote and the installed ccc cannot read, with a message such as `Failed to deserialize pickle payload`.
55
55
 
56
- **Fix:** from the project root, run `ccc reset`, then `ccc daemon restart`, then re-run `@Ferris SF`. `ccc reset` deletes only the index databases and keeps `.cocoindex_code/settings.yml` with SKF's exclusions. Restart the daemon before indexing again: it still holds the databases `ccc reset` deleted, so an index built right after the reset can fail with `environment already open in this program`.
56
+ **Fix:** from the project root, run `ccc reset`, then `ccc daemon restart`, then re-run `@Ferris SF`. `ccc reset` deletes only the index databases and keeps `.cocoindex_code/settings.yml` with SKF's exclusions. Restart the daemon before indexing again: it still holds the databases `ccc reset` deleted, so an index built right after the reset can fail with `environment already open in this program`. In a headless run, a first index of a large project can also outlast the longest timeout the agent's shell gives a command, and Setup then reports the stopped call as a failed index (an interactive run builds such an index in the background and waits for it): run `ccc index` in a terminal in the project, then re-run `@Ferris SF`.
57
57
 
58
58
  ### `@Ferris deepwiki` shows a deprecation notice
59
59
 
@@ -69,6 +69,12 @@ Test Skill checks a skill against the source commit it was made from. When the s
69
69
 
70
70
  **Fix:** check out the pinned commit the message shows with `git -C <source> checkout <pinned commit>`, then re-run `@Ferris TS <name>`. The checkout line in the message names the skill's `source_ref` when it has one. When `source_ref` is a branch, that line does not move a checkout that is already on a newer commit of the branch. To test against the source as it is now, re-run with `--allow-workspace-drift`: the findings then describe the current checkout, and a pass under that flag does not clear the skill for export until you re-test at the pinned commit. Right after an update, follow the update's report instead (see "Update Skill stops with `blocked` before detecting changes").
71
71
 
72
+ ### Test Skill stops with `another-run-active`
73
+
74
+ Surfaced by `@Ferris TS` (exit `1`) at one of two points. At the start (under `--headless`, `error.phase` is `init:run-lock`), another test of the same skill version holds its run lock, `.test-skill.lock` in `<forge_data_folder>/<name>/<version>/`, and the lock has not gone stale (60 minutes after it was taken or renewed). Just before it writes its results (`report:run-lock`), the run's own lock went stale and another run took it over, so it stops and writes no result. A run that was cut off, by a closed session or by a `claude -p` run whose agent ended its turn early (no `SKF_TEST_RESULT_JSON` line, and `claude -p` still exits `0`), leaves its lock behind, with its in-progress report `.skf-test-report-<name>-<run_id>.md` in the version folder and its run folder `_bmad-output/.skf-run/skf-test-skill-<run_id>/`.
75
+
76
+ **Fix:** wait until the other test ends, then re-run. If no test of that skill is running, delete the lock file the message names, or wait until the time it gives: a test that finds a stale lock takes it over. After `report:run-lock`, re-run once the run that took the lock over has ended. A run cut off before its result step wrote no result, so `skf-test-skill-result-latest.json` still holds an earlier run's verdict, and one cut off later wrote it: re-run the test rather than read that file. Its in-progress report and run folder are safe to delete once no test of that skill is running.
77
+
72
78
  ### forge-auto halted at the Test stage
73
79
 
74
80
  forge-auto aims for 90%, stricter than the default 80%. A score of at least 80% but under 90% still passes, with an `evidence-report-fallback.md` that records the shortfall, unless a cap fired. TS stops the pipeline on any verdict but PASS: every FAIL (a score below 80%, a Critical or High gap at the hard gate, or a cap that turned a pass into a fail whatever the score), INCONCLUSIVE, and pass-with-drift. Run `@Ferris US <name> --from-test-report` to repair the gaps the report lists, then `@Ferris TS[<name>] EX` to test and export again (the brackets give Test Skill the skill's name). A plain `@Ferris US <name>` finds a failed or pass-with-drift test report that is newer than the skill and that no repair has applied, and offers to repair its gaps; a headless run checks the source for changes instead and adds an `unconsumed-test-report` warning. For INCONCLUSIVE, add evidence as [Pass/fail](/docs/verifying-a-skill.md#passfail) describes; for pass-with-drift, test again at the pinned commit. If 90% is stricter than you need, run the individual workflows or `forge` instead, which use the default threshold.
@@ -113,7 +119,7 @@ Rename rewrites the skill's `name` fields, the name where the snippet template w
113
119
 
114
120
  Surfaced by `@Ferris RS` (exit `5`) when another rename of the same skill holds its run lock, `.skf-rename-<name>.lock` in `forge_data_folder`, and the lock has not gone stale (60 minutes after it was taken or renewed). A rename that waited at a question past that time stops the same way before it copies anything, because another rename may have run in the meantime. `--dry-run` takes no lock.
115
121
 
116
- **Fix:** wait until the other rename ends, then run the rename again. If no rename of that skill is running, delete the lock file the message names, or wait until the time it gives.
122
+ **Fix:** wait until the other rename ends, then run the rename again. If no rename of that skill is running (a closed session or a cut-off `claude -p` run leaves its lock behind), delete the lock file the message names, or wait until the time it gives.
117
123
 
118
124
  ### Rename Skill stops with `name-collision` and lists old folders
119
125
 
@@ -147,7 +153,7 @@ Surfaced by `@Ferris US` (under `--headless`, `error.phase` is `merge:new-versio
147
153
 
148
154
  Surfaced by `@Ferris US` when another update of the same skill holds its run lock, `.skf-update.lock` in `<forge_data_folder>/<name>/` (under `--headless`, `error.phase` is `init:concurrency-guard`). The message names the update that holds the lock, the lock file, and when the lock goes stale (60 minutes after it was taken or renewed). `--detect-only` and `--dry-run` take no lock.
149
155
 
150
- **Fix:** wait until the other update ends, then re-run. If no update of that skill is running (a session that crashed or was closed leaves its lock behind), delete the lock file the message names, or wait until the time it gives. An update that finds a stale lock takes it over and undoes what the interrupted update left half written.
156
+ **Fix:** wait until the other update ends, then re-run. If no update of that skill is running (a session that crashed or was closed, or a `claude -p` run cut off when its agent ended its turn, leaves its lock behind), delete the lock file the message names, or wait until the time it gives. An update that finds a stale lock takes it over and undoes what the interrupted update left half written.
151
157
 
152
158
  **`run-lock-lost`:** the same status with this reason means the update waited at a question past the stale time, so another update may have changed the skill (`error.phase` is `merge:run-lock` or `write:run-lock`). It stops before it writes `metadata.json`, and the halt undoes anything the update already wrote: it removes the new version folders, or, for a repair from a test report, restores the files it edited in place from the copy it took first, and the message says which. Re-run the update once no other update of that skill runs; if a version folder the message names is still on disk, delete it first.
153
159