akm-cli 0.9.29 → 0.9.31

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 (162) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +10 -10
  3. package/ROADMAP.md +112 -0
  4. package/dist/commands/improve/improve-cli.js +33 -12
  5. package/dist/commands/sources/plugin-upgrade.js +46 -23
  6. package/dist/core/file-lock.js +10 -1
  7. package/dist/llm/client.js +33 -3
  8. package/dist/scripts/akm-migrate-node.js +5 -1
  9. package/dist/scripts/akm-migrate.js +5 -1
  10. package/docs/README.md +42 -41
  11. package/docs/agents/README.md +15 -0
  12. package/docs/agents/agent-install.md +14 -0
  13. package/docs/architecture/README.md +67 -0
  14. package/docs/architecture/adapters.md +272 -0
  15. package/docs/architecture/akm-architecture-decision-history.md +2055 -0
  16. package/docs/architecture/akm-core-principles.md +126 -0
  17. package/docs/architecture/architecture.md +579 -0
  18. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +550 -0
  19. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +72 -0
  20. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +142 -0
  21. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +189 -0
  22. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +97 -0
  23. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +108 -0
  24. package/docs/architecture/decisions/0006-task-source-version-routing.md +124 -0
  25. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +83 -0
  26. package/docs/architecture/decisions/0008-task-binding-normalization.md +88 -0
  27. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +80 -0
  28. package/docs/architecture/decisions/0010-driver-protocol-cut.md +36 -0
  29. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +125 -0
  30. package/docs/architecture/decisions/README.md +62 -0
  31. package/docs/architecture/improvement.md +440 -0
  32. package/docs/architecture/internals/classification.md +154 -0
  33. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +40 -0
  34. package/docs/architecture/internals/functional-contract-patterns.md +340 -0
  35. package/docs/architecture/internals/health-advisories.md +110 -0
  36. package/docs/architecture/internals/improve-workflow.md +713 -0
  37. package/docs/architecture/internals/indexing.md +498 -0
  38. package/docs/architecture/internals/registry-network-boundary.md +57 -0
  39. package/docs/architecture/internals/search.md +249 -0
  40. package/docs/architecture/internals/storage-locations.md +943 -0
  41. package/docs/architecture/persisted-data-compat.md +59 -0
  42. package/docs/architecture/reviews/env-secret-access.md +319 -0
  43. package/docs/architecture/runtime-boundary-design.md +153 -0
  44. package/docs/architecture/specs/0.9.0-close-out-plan.md +361 -0
  45. package/docs/architecture/specs/0.9.0-decisions.md +528 -0
  46. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +745 -0
  47. package/docs/architecture/specs/0.9.0-open-items-register.md +135 -0
  48. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +740 -0
  49. package/docs/architecture/specs/0.9.0-release-surface-review.md +636 -0
  50. package/docs/architecture/specs/agent-command-engine-model-design.md +513 -0
  51. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +501 -0
  52. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +291 -0
  53. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +2059 -0
  54. package/docs/architecture/specs/di-seams-plan.md +539 -0
  55. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +275 -0
  56. package/docs/architecture/specs/fact-asset-type.md +142 -0
  57. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +634 -0
  58. package/docs/architecture/specs/okf-support.md +148 -0
  59. package/docs/architecture/specs/ref.md +329 -0
  60. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +72 -0
  61. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +152 -0
  62. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +352 -0
  63. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +300 -0
  64. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +402 -0
  65. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +758 -0
  66. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +645 -0
  67. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +602 -0
  68. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +27 -0
  69. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +27 -0
  70. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +74 -0
  71. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +15 -0
  72. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +132 -0
  73. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +147 -0
  74. package/docs/architecture/specs/stash-conventions-code-spec.md +275 -0
  75. package/docs/architecture/specs/stash-organization-conventions.md +377 -0
  76. package/docs/architecture/specs/task-workflow-format-unification.md +721 -0
  77. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +231 -0
  78. package/docs/architecture/specs/workflow-format-unification.md +437 -0
  79. package/docs/architecture/testing/manual-testing-checklist.md +3420 -0
  80. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +924 -0
  81. package/docs/architecture/testing/task-workflow-manual-tests.md +1817 -0
  82. package/docs/architecture/testing/testing-workflow.md +446 -0
  83. package/docs/architecture/workflow-engine.md +274 -0
  84. package/docs/guides/README.md +33 -0
  85. package/docs/guides/author-bundles.md +310 -0
  86. package/docs/guides/author-workflows.md +520 -0
  87. package/docs/guides/bundles.md +321 -0
  88. package/docs/guides/capture-knowledge.md +136 -0
  89. package/docs/guides/claude-code-vs-akm-workflows.md +30 -0
  90. package/docs/guides/concepts.md +93 -0
  91. package/docs/guides/discover-and-load.md +158 -0
  92. package/docs/guides/getting-started.md +240 -0
  93. package/docs/guides/improve-the-library.md +246 -0
  94. package/docs/guides/knowledge-management.md +18 -0
  95. package/docs/guides/recipes/headless-install.md +97 -0
  96. package/docs/guides/recipes/website-source.md +28 -0
  97. package/docs/guides/run-workflows.md +279 -0
  98. package/docs/guides/scheduling.md +123 -0
  99. package/docs/guides/use-with-any-agent.md +129 -0
  100. package/docs/guides/wikis.md +81 -0
  101. package/docs/maintainers/README.md +19 -0
  102. package/docs/maintainers/curate-workmap.md +336 -0
  103. package/docs/maintainers/eval.md +3 -0
  104. package/docs/maintainers/local-development.md +108 -0
  105. package/docs/maintainers/release-checklist.md +103 -0
  106. package/docs/migration/README.md +2 -2
  107. package/docs/migration/release-notes/0.0.13.md +1 -1
  108. package/docs/migration/release-notes/0.1.0.md +1 -1
  109. package/docs/migration/release-notes/0.2.0.md +1 -1
  110. package/docs/migration/release-notes/0.3.0.md +1 -1
  111. package/docs/migration/release-notes/0.5.0.md +1 -1
  112. package/docs/migration/release-notes/0.6.0.md +1 -1
  113. package/docs/migration/release-notes/0.7.0.md +1 -1
  114. package/docs/migration/release-notes/0.7.3.md +2 -2
  115. package/docs/migration/release-notes/0.7.4.md +1 -1
  116. package/docs/migration/release-notes/0.7.5.md +1 -1
  117. package/docs/migration/release-notes/0.8.0.md +1 -1
  118. package/docs/migration/release-notes/0.9.0.md +1 -1
  119. package/docs/migration/release-notes/0.9.14.md +1 -1
  120. package/docs/migration/release-notes/0.9.15.md +1 -1
  121. package/docs/migration/release-notes/0.9.16.md +1 -1
  122. package/docs/migration/release-notes/0.9.17.md +1 -1
  123. package/docs/migration/release-notes/0.9.19.md +1 -1
  124. package/docs/migration/release-notes/0.9.2.md +1 -1
  125. package/docs/migration/release-notes/README.md +27 -31
  126. package/docs/migration/v0.5-to-v0.6.md +759 -0
  127. package/docs/migration/v0.8-to-v0.9.md +1 -1
  128. package/docs/plans/0.9.2-agent-command-workflow-plan.md +423 -0
  129. package/docs/posts/README.md +30 -0
  130. package/docs/posts/akm-command-tour.md +495 -0
  131. package/docs/posts/akm-logo-sized.webp +0 -0
  132. package/docs/posts/belief-aware-memory-12.md +139 -0
  133. package/docs/posts/config-v2-lessons-16.md +191 -0
  134. package/docs/posts/improve-loop-autonomous-10.md +225 -0
  135. package/docs/posts/improve-pipeline-debugging-0803.md +179 -0
  136. package/docs/posts/intro-part-01.md +76 -0
  137. package/docs/posts/intro-part-02.md +221 -0
  138. package/docs/posts/intro-part-03.md +190 -0
  139. package/docs/posts/intro-part-04.md +221 -0
  140. package/docs/posts/llm-mode-reflect-13.md +166 -0
  141. package/docs/posts/openpalm-built-on-akm.md +86 -0
  142. package/docs/posts/progressive-disclosure-06.md +129 -0
  143. package/docs/posts/proposal-safety-net-15.md +112 -0
  144. package/docs/posts/release-0.5.0.md +247 -0
  145. package/docs/posts/release-0.6.0.md +117 -0
  146. package/docs/posts/release-0.7.0.md +159 -0
  147. package/docs/posts/release-0.8.0.md +332 -0
  148. package/docs/posts/scattered-skills-05.md +100 -0
  149. package/docs/posts/task-assets-persistent-workflows-11.md +222 -0
  150. package/docs/posts/team-skills-07.md +198 -0
  151. package/docs/posts/wiki-agent-knowledge-08.md +223 -0
  152. package/docs/posts/workflows-vaults-09.md +321 -0
  153. package/docs/product-surface.md +54 -0
  154. package/docs/reference/README.md +1 -2
  155. package/docs/reference/asset-types.md +168 -0
  156. package/docs/reference/cli.md +5 -6
  157. package/docs/reference/env-and-secrets.md +126 -0
  158. package/docs/reference/memory.md +124 -0
  159. package/docs/reference/refs.md +156 -0
  160. package/docs/reference/registry.md +489 -0
  161. package/docs/reference/website-sources.md +141 -0
  162. package/package.json +12 -15
@@ -0,0 +1,332 @@
1
+ ---
2
+ title: 'akm 0.8.0: CLI Redesign, Task Assets, and Belief-Aware Memory'
3
+ cover_image: 'https://raw.githubusercontent.com/itlackey/akm/main/docs/posts/akm-logo-sized.webp'
4
+ series: akm-releases
5
+ description: 'akm 0.8.0 introduces a redesigned `improve` command, task assets for persistent agent workflows, and belief-aware memory for more accurate stash updates.'
6
+ tags:
7
+ - ai
8
+ - agents
9
+ - cli
10
+ - release
11
+ published: true
12
+ ---
13
+
14
+ > This is a dated article from AKM's publishing archive. For current product behavior, see the
15
+ > [documentation index](https://github.com/itlackey/akm/blob/main/docs/README.md).
16
+
17
+ akm 0.8.0 is out. This release combines the storage reorganization and CLI redesign with the final improve-owned maintenance migration: plain `akm index` now keeps metadata current, while slower memory inference and graph extraction maintenance run from `akm improve` after consolidation.
18
+
19
+ If you are on 0.7.x, the v1 migration guide covers the per-surface delta. The upgrade requires updating scripts and agent instructions due to breaking CLI changes.
20
+
21
+ ## TL;DR
22
+
23
+ - **`akm improve`** — unified command for agent-driven asset refinement and post-loop maintenance.
24
+ - **Improve-owned maintenance** — memory inference and graph extraction now run from `akm improve`, not `akm index`.
25
+ - **End-of-run auto-sync** — `akm improve` now auto-commits git-backed stashes; `--sync`/`--no-sync`/`--push`/`--no-push` flags + token-based commit messages.
26
+ - **Task assets** — first-class asset type for defining persistent agent workflows with cron scheduling and manual invocation.
27
+ - **Belief-aware memory** — stash updates now incorporate the agent's belief state to prevent overwriting correct information.
28
+ - **Proposal queue commands renamed** — old flat commands (`akm proposals`, `akm show proposal`, `akm diff proposal`, `akm accept`, `akm reject`) are now (`akm proposal list`, `akm proposal show`, `akm proposal diff`, `akm proposal accept`, `akm proposal reject`).
29
+ - **`akm health`** — runtime health report for `state.db`, task execution logs, agent availability, and recent improve telemetry.
30
+ - **CLI breaking changes** — proposal queue workflows are consolidated around `akm improve`, `akm propose`, `akm proposal list`, `akm proposal show`, `akm proposal diff`, `akm proposal accept`, and `akm proposal reject` (old flat aliases deprecated); update your automation.
31
+ - **Release hardening** — empty-query search is a structured error again, `remember --enrich` now truly fail-softs, improve lock-leak on initialization errors fixed, and the Docker install matrix is green for Bun and binary paths.
32
+
33
+ ---
34
+
35
+ ## `akm improve`: The New Self-Improvement Surface
36
+
37
+ The `akm improve` command consolidates asset refinement workflows. It can operate on a specific asset type (generating a new asset) or an existing asset ref (refining that asset). Under the hood, it uses the same proposal queue as before, ensuring all changes are reviewable before promotion.
38
+
39
+ ```sh
40
+ akm improve <type> # scope the run to all assets of that type
41
+ akm improve <ref> # refine an existing asset and produce a proposal
42
+ ```
43
+
44
+ This consolidates the main proposal-oriented improvement workflow. It also now owns the slow maintenance passes that used to be coupled to indexing: after distill and consolidation settle the corpus, improve runs memory inference, reindexes if inference wrote new facts, and then refreshes graph extraction against the final post-improve state.
45
+
46
+ ## End-of-Run Git Sync and Commit Templating
47
+
48
+ For git-backed stashes (detected by `.git` directory presence), `akm improve`
49
+ now commits all changes as a single batch at the end of the run. Two new flags
50
+ control the behavior:
51
+
52
+ ```sh
53
+ akm improve # default/thorough profiles: auto-commit + push
54
+ akm improve --no-sync # skip the end-of-run commit for this run
55
+ akm improve --no-push # commit but skip push
56
+ akm improve --sync # force sync even on profiles that disable it
57
+ ```
58
+
59
+ **Sync defaults by profile:**
60
+
61
+ | Profile | Sync | Push |
62
+ |---------|------|------|
63
+ | `default` | ✓ | ✓ |
64
+ | `thorough` | ✓ | ✓ |
65
+ | `quick` | — | — |
66
+ | `memory-focus` | — | — |
67
+
68
+ Lightweight passes (`quick`, `memory-focus`) opt out of auto-sync to avoid
69
+ auto-committing partial results.
70
+
71
+ **Commit message templates:** The `sync.message` config field supports `{token}`
72
+ placeholders — `{timestamp}`, `{date}`, `{time}`, `{scope}`, `{refs}`,
73
+ `{accepted}` — so the commit log can carry run context:
74
+
75
+ ```jsonc
76
+ "sync": { "message": "akm improve {scope} — {refs} refs ({date})" }
77
+ ```
78
+
79
+ The improve result includes a `sync` field (`{ committed, pushed, skipped,
80
+ reason? }`) and a `stash_synced` event is emitted to `state.db`. Sync failures
81
+ are non-fatal — they never fail a successful run.
82
+
83
+ ## Consolidate Reliability Improvements
84
+
85
+ The consolidate pass received two reliability fixes:
86
+
87
+ - **Pre-flight stale-DB filter**: entries that have gone stale in the DB since
88
+ the run started are filtered out before any LLM calls, eliminating wasted
89
+ tokens on already-processed content.
90
+ - **Defense-in-depth merge guards**: four layers of guards now prevent
91
+ incorrect merges, improving correctness on edge cases.
92
+
93
+ ## Task Assets: Persistent Agent Workflows
94
+
95
+ Task assets (`tasks/<name>.yml`) allow you to define persistent agent workflows that can be triggered on a schedule or manually. Each task runs using the configured agent runtime.
96
+
97
+ Key features:
98
+ - **Cron-based scheduling** (with proper escaping for special characters)
99
+ - **Manual invocation** via `akm tasks run <id>`
100
+ - **Proposal-driven updates** (task agents propose changes via `akm improve`, which go through the proposal queue)
101
+
102
+ Example task asset:
103
+ ```yaml
104
+ name: daily-code-review
105
+ schedule: '0 9 * * *' # every day at 9 AM
106
+ command: opencode
107
+ prompt: "Review the staged changes and suggest improvements"
108
+ ```
109
+
110
+ ## Belief-Aware Memory
111
+
112
+ Memory assets now carry a `beliefState` frontmatter field (values: `active`, `asserted`, `deprecated`, `superseded`, `contradicted`, `archived`). The consolidation and improve passes use this field to track and transition belief state — for example, marking a memory `contradicted` when a newer fact conflicts with it. This reduces the chance of outdated or incorrect beliefs persisting in the stash after new information arrives.
113
+
114
+ ## Proposal Queue: Renamed Commands
115
+
116
+ The proposal queue itself is unchanged, but the CLI surfaces have been reorganized under a `proposal` subcommand:
117
+
118
+ | Old Command (0.7.x) | New Command (0.8.0+) |
119
+ |----------------------|---------------------------|
120
+ | `akm proposals` | `akm proposal list` |
121
+ | `akm show proposal` | `akm proposal show` |
122
+ | `akm diff proposal` | `akm proposal diff` |
123
+ | `akm accept` | `akm proposal accept` |
124
+ | `akm reject` | `akm proposal reject` |
125
+
126
+ All commands retain the same functionality and flags (e.g., `akm proposal reject <id> --reason "..."`). The old flat verbs still work as deprecated aliases (they warn on stderr) and will be removed in 0.9.0 — update your scripts and documentation before then.
127
+
128
+ ## `akm health`: Runtime Checks in One Command
129
+
130
+ `akm health` provides a quick operator-facing snapshot of whether the local akm
131
+ runtime is healthy.
132
+
133
+ ```sh
134
+ akm health
135
+ akm health --since 24h
136
+ akm health --since 7d --format text
137
+ ```
138
+
139
+ It checks that `state.db` is readable and writable, verifies that required
140
+ tables exist, inspects `task_history` for missing log files or stale active
141
+ runs, probes the default agent profile, and summarizes recent `akm improve`
142
+ activity from `improve_invoked`, `improve_skipped`, and `improve_completed`
143
+ events.
144
+
145
+ This makes it easier to validate an upgraded installation after migration or to
146
+ spot regressions in task execution and improve-loop maintenance without querying
147
+ SQLite tables directly.
148
+
149
+ ## Agent Command Builder: Platform-Aware Dispatch
150
+
151
+ `akm agent` can now embody a stash agent asset — setting the system prompt, model, and tool policy automatically from the asset's metadata:
152
+
153
+ ```sh
154
+ akm agent opencode agent:code-reviewer --prompt "review src/commands/"
155
+ akm agent claude agent:planner --model sonnet --prompt "plan the next sprint"
156
+ ```
157
+
158
+ The `<agent-ref>` positional resolves the agent asset's content as the system prompt, its `model:` frontmatter as the model, and its `tools:` frontmatter as the allowed tool set. Each platform gets the exact flags its CLI expects:
159
+
160
+ - **opencode**: `opencode run --system-prompt "..." --model opencode/claude-opus-4-7 "<prompt>"`
161
+ - **claude**: `claude --system-prompt "..." --model claude-opus-4-7 --allowedTools read,edit --print "<prompt>"`
162
+
163
+ Built-in model aliases (`opus`, `sonnet`, `haiku`) resolve to the correct model string per platform. Add custom aliases in `agent.profiles.<name>.modelAliases`. Override any asset's model for a single run with `--model`.
164
+
165
+ Without a prompt or agent-ref, `akm agent opencode` still launches the agent interactively — unchanged.
166
+
167
+ ## Graph Extraction: Faster, Cleaner, Schema-Stable
168
+
169
+ 0.8.0 reshapes how graph extraction is stored, queried, and refreshed. The
170
+ visible wins:
171
+
172
+ - **Schema cascade fix.** `graph_files` now keys on `entry_id INTEGER PRIMARY
173
+ KEY REFERENCES entries(id) ON DELETE CASCADE`, and the child tables
174
+ (`graph_file_entities`, `graph_file_relations`) cascade through. Removing a
175
+ stash or deleting an entry now correctly cleans up the graph rows — no more
176
+ orphans accumulating in `index.db`.
177
+ - **Incremental refreshes.** Graph extraction now filters on a
178
+ `candidatePaths` set, so each `akm improve` cycle revisits only touched
179
+ assets instead of the whole stash. The default `graphExtractionBatchSize`
180
+ rose from 1 to 4 (auto-tuned against `llm.contextLength`).
181
+ - **Fewer writes.** `replaceStoredGraph` is now incremental — unchanged entries
182
+ skip, changed entries swap their child rows in place, removed entries
183
+ cascade out. Roughly 700× fewer row writes per pass on typical re-extractions.
184
+ - **Faster lookups.** `listRelatedPathsForFile` is a scoped SQL self-join
185
+ instead of a full snapshot load: ~30ms → ~2ms on a typical stash.
186
+ - **New commands.** `akm graph entity <name>` inverts the entities view (every
187
+ asset that mentions a given entity, by confidence). `akm graph orphans`
188
+ surfaces assets that produced zero entities — quality-triage candidates.
189
+ See the 0.8.0 migration guide's
190
+ [graph extraction section](../migration/v0.7-to-v0.8.md#memory-inference-and-graph-extraction-moved-out-of-index).
191
+ - **Better output.** `akm graph relations` and `akm graph entities` now show
192
+ per-row confidence. Search hits annotate the graph-boost contribution in
193
+ `whyMatched`. Related results end with a `Next: akm show '<ref>'` hint
194
+ pointing at the top neighbor.
195
+ - **Ref-form output.** Related results now show canonical refs
196
+ (e.g. `memory:incident-2026-05-12`) instead of raw file paths.
197
+
198
+ **DB_VERSION bumped to 17.** The schema change uses the existing
199
+ DROP+rebuild upgrade path: non-graph tables (`entries`, embeddings, FTS) rebuild
200
+ automatically the first time akm opens `index.db`; graph tables repopulate on
201
+ the next `akm improve` cycle, which makes LLM calls. The first improve cycle
202
+ after upgrade is slower than steady state, but the Phase 1 / Phase 2
203
+ improvements above make it dramatically faster than equivalent re-extraction
204
+ on 0.7.x. See the migration guide section
205
+ [Graph extraction will re-run after upgrade](../migration/v0.7-to-v0.8.md#graph-extraction-will-re-run-after-upgrade).
206
+
207
+ ## Config v2 and reflect LLM mode
208
+
209
+ 0.8.0 introduces a new config shape (`configVersion: "0.8.0"`) that replaces
210
+ the scattered v1 keys with a unified `profiles` + first-class feature tree.
211
+ Named LLM connections live under `profiles.llm.<name>` and named agent
212
+ connections under `profiles.agent.<name>`, each declared once and referenced
213
+ by name from process entries on `profiles.improve.<name>`. The old
214
+ `llm.features.*` boolean flags and `agent.processes` map are replaced by
215
+ `profiles.improve.<name>.processes.*` (improve-bound work), plus top-level
216
+ `index.metadataEnhance`, `index.stalenessDetection`, and `search.curateRerank`
217
+ sections (non-improve features) — each entry using a unified `{mode, profile,
218
+ timeoutMs, options}` shape. Configs without `configVersion` are auto-migrated
219
+ at first run; a timestamped backup is written before any in-place rewrite.
220
+
221
+ With the new config in place, the reflect pass inside `akm improve` can now
222
+ run as a direct LLM call instead of spawning an opencode subprocess. For reflect, the context is statically pre-assembled, so a direct
223
+ HTTP call captures the full quality benefit at a fraction of the cost. LLM mode
224
+ also adds multi-turn self-refine (the prior draft is sent back as an assistant
225
+ turn) and structured JSON output for providers that set `supportsJsonSchema:
226
+ true`. The performance difference is significant:
227
+
228
+ | Mode | Time per reflect call | 69-ref improve run |
229
+ | --- | --- | --- |
230
+ | agent (CLI subprocess) | ~30s | ~35 min |
231
+ | sdk (in-process opencode) | ~10–15s | ~12–17 min |
232
+ | llm (direct HTTP) | ~6–10s | ~8–10 min |
233
+
234
+ To opt in to LLM mode for reflect:
235
+
236
+ ```jsonc
237
+ // Opt in to LLM mode for reflect (3-5x faster)
238
+ {
239
+ "configVersion": "0.8.0",
240
+ "profiles": {
241
+ "llm": {
242
+ "openai-mini": {
243
+ "endpoint": "https://api.openai.com/v1/chat/completions",
244
+ "model": "gpt-4o-mini",
245
+ "apiKey": "${OPENAI_API_KEY}",
246
+ "supportsJsonSchema": true
247
+ }
248
+ },
249
+ "improve": {
250
+ "default": {
251
+ "processes": {
252
+ "reflect": { "mode": "llm", "profile": "openai-mini" }
253
+ }
254
+ }
255
+ }
256
+ },
257
+ "defaults": { "llm": "openai-mini" }
258
+ }
259
+ ```
260
+
261
+ To migrate an existing config:
262
+
263
+ ```sh
264
+ # Preview the transformation
265
+ akm config migrate --dry-run # doclint:ignore (historical — akm 0.8.0 release announcement; config-schema migration command not present in 0.9.0)
266
+
267
+ # Apply (writes a timestamped backup first)
268
+ akm config migrate # doclint:ignore (historical — akm 0.8.0 release announcement; config-schema migration command not present in 0.9.0)
269
+ ```
270
+
271
+ Full reference: [configuration reference](../reference/configuration.md).
272
+ Full key mapping: [v0.7 to v0.8 migration guide — Config 0.8.0 migration](../migration/v0.7-to-v0.8.md#config-080-migration-unified-profiles).
273
+
274
+ ## Migration Guidance
275
+
276
+ Breaking changes in 0.8.0:
277
+ - Consolidated around: `akm improve`, `akm propose`, `akm proposal list`, `akm proposal show`, `akm proposal diff`, `akm proposal accept`, `akm proposal reject`, `akm proposal revert` (old flat aliases deprecated)
278
+ - Added: task assets, renamed proposal commands
279
+ - Added: `akm health` for runtime and improve telemetry checks
280
+ - Added: end-of-run auto-sync for git-backed stashes (`--no-sync` to opt out)
281
+ - Removed: `akm index --enrich` and `akm index --re-enrich`
282
+ - Changed: plain `akm index` now owns metadata enhancement only; slow LLM maintenance moved to `akm improve`
283
+ - Windows task path parsing now correctly handles absolute paths and drive letters
284
+ - Cron expressions with apostrophes are now properly escaped in schtasks XML
285
+
286
+ To upgrade:
287
+ 1. Update any scripts or automation that still target the pre-0.8 proposal queue and indexing workflow.
288
+ 2. Prefer `akm improve` for the main refinement/maintenance workflow.
289
+ 3. Stop calling `akm index --enrich`; use plain `akm index` plus `akm improve` maintenance flows.
290
+ 4. Use `akm health --since 24h` after upgrade to confirm state-db and task-history health.
291
+ 5. Rename proposal queue commands as per the table above.
292
+ 6. Review task definitions for Windows path compatibility if using absolute paths.
293
+ 7. Run `akm config migrate` to upgrade your config to the v2 shape and unlock LLM-mode reflect.
294
+
295
+ No manual data migration is required. The proposal queue and existing stash assets remain compatible.
296
+
297
+ ## Try the New Surfaces
298
+
299
+ ```sh
300
+ # Scope an improve run to all memory assets
301
+ akm improve memory --task "Summarize today's debugging session"
302
+
303
+ # List improvement proposals
304
+ akm proposal list
305
+
306
+ # Show one proposal
307
+ akm proposal show <id>
308
+
309
+ # Accept a proposal (after review)
310
+ akm proposal accept <id>
311
+
312
+ # Define and run a task
313
+ akm tasks run daily-code-review # doclint:ignore (historical — akm 0.8.0 release announcement; `tasks` renamed `task` in 0.9.0)
314
+
315
+ # Run improve with a specific profile (reflect mode comes from the profile)
316
+ akm improve memory:my-note --profile fast-llm # doclint:ignore (historical — akm 0.8.0 release announcement; `--profile` renamed `--strategy` in 0.9.0)
317
+ ```
318
+
319
+ ## Verification
320
+
321
+ After upgrading:
322
+ ```sh
323
+ akm info --format text # version 0.8.x
324
+ akm health --since 24h # runtime + improve telemetry checks
325
+ akm proposal list # queue starts empty — that's expected
326
+ akm task list # shows your defined tasks — doclint:ignore (historical — akm 0.8.0 release announcement; `tasks list` inspection moved to `akm search`/`akm show` by 0.9.0)
327
+ akm config get configVersion # "0.8.0" after akm config migrate
328
+ ```
329
+
330
+ Full details in the [v0.7 to v0.8 migration guide](../migration/v0.7-to-v0.8.md) and the [configuration reference](../reference/configuration.md).
331
+
332
+ Full changelog at [CHANGELOG.md](https://github.com/itlackey/akm/blob/main/CHANGELOG.md).
@@ -0,0 +1,100 @@
1
+ ---
2
+ title: 'Stop Copying Skills Between Claude Code, Cursor, and Codex'
3
+ cover_image: 'https://raw.githubusercontent.com/itlackey/akm/main/docs/posts/akm-logo-sized.webp'
4
+ series: akm-skills
5
+ description: Your agent skills are scattered across three tools. Here's why indexing in place beats copying or syncing.
6
+ tags:
7
+ - ai
8
+ - agents
9
+ - cli
10
+ - skills
11
+ published: true
12
+ id: 3426225
13
+ date: '2026-03-29T16:31:49Z'
14
+ ---
15
+
16
+ > This is a dated article from AKM's publishing archive. For current product behavior, see the
17
+ > [documentation index](https://github.com/itlackey/akm/blob/main/docs/README.md).
18
+
19
+ This is part five in a series about wrangling the growing pile of skills, scripts, and context that AI coding agents depend on. In [part one](https://dev.to/itlackey/your-ai-agents-skill-list-is-getting-out-of-hand-32ck), I covered why progressive disclosure beats dumping everything into context. [Part two](https://dev.to/itlackey/you-already-have-dozens-of-agent-skills-you-just-cant-find-them-bpo) showed how `akm` unifies your local assets across platforms into one searchable stash. [Part three](https://dev.to/itlackey/your-agents-memory-shouldnt-disappear-when-the-session-ends) added remote context via OpenViking for teams. And [part four](https://dev.to/itlackey/your-agent-doesnt-know-what-the-community-already-figured-out) plugged in community knowledge through Context Hub.
20
+
21
+ All of that assumed you were picking one tool. But you're probably not. You've got Claude Code at work, Codex for side projects, Cursor for quick edits. Each one has its own skills directory — `~/.claude/skills/`, `~/.codex/skills/`, `.cursor/rules/` — and none of them can see each other.
22
+
23
+ So you rebuild the same deploy skill twice. You forget where the good version of your testing scaffold lives. You copy files between directories and they drift within a week. You end up grepping across three different paths trying to find the one that handled database migrations correctly.
24
+
25
+ This isn't a tooling problem. It's a discovery problem. And in the past week alone, three separate products launched to fix it — a macOS GUI for browsing skill files, a web-based editor for organizing them, a designer's viral Medium post about layered architecture for skills. People are clearly hurting here.
26
+
27
+ But every one of those solutions wants you to *move* your files somewhere. Copy them into a central location. Sync them between directories. Maintain one source of truth that you manually keep updated.
28
+
29
+ There's a better approach: don't move anything. Just make everything searchable.
30
+
31
+ ## Copy and Sync (The Obvious Way)
32
+
33
+ Pick a canonical directory, copy everything into it, keep it updated. Tools like ClaudeMDEditor make this easier with a GUI, and symlinks can automate some of it.
34
+
35
+ Works great — until it doesn't. You update the original and forget to sync. The copy drifts. You end up with two versions of the same skill, slightly different, and no way to tell which is current. The maintenance overhead scales linearly with every new skill and every new platform.
36
+
37
+ ## GUI Discovery (The Pretty Way)
38
+
39
+ Tools like Chops give you a nice interface for browsing your skill files. You can see what's where, organize them visually, tag them.
40
+
41
+ But your agent can't use a GUI. When Claude Code is mid-task and needs a deployment skill, it can't open an Electron app and browse around. It needs something it can *call* — a programmatic interface that returns results without human intervention.
42
+
43
+ ## Index in Place (The akm Way)
44
+
45
+ This is the approach [akm](https://github.com/itlackey/akm) takes. Don't move your files. Don't copy them. Don't sync them. Just point at them and build an index.
46
+
47
+ Your skills stay exactly where each tool expects them. Claude Code still finds its skills in `~/.claude/skills/`. Cursor still reads `.cursor/rules/`. Nothing breaks. But now there's a single search layer across all of them.
48
+
49
+ When your agent needs something, it searches once and gets results from every source. When you update a skill in its original location, the index picks up the change. No sync step. No drift.
50
+
51
+ ## Five Commands and You're Done
52
+
53
+ Here's the full setup. Takes about 30 seconds.
54
+
55
+ ```sh
56
+ # Install
57
+ curl -fsSL https://raw.githubusercontent.com/itlackey/akm/main/install.sh | bash
58
+
59
+ # Initialize
60
+ akm setup
61
+
62
+ # Point at your existing skill directories
63
+ akm add ~/.claude/skills # doclint:ignore (historical — pre-0.9.0 command spelling)
64
+ akm add ~/.codex/skills # doclint:ignore (historical — pre-0.9.0 command spelling)
65
+ akm add .cursor/rules # doclint:ignore (historical — pre-0.9.0 command spelling)
66
+
67
+ # Search across all of them
68
+ akm search "deploy"
69
+ ```
70
+
71
+ That last command returns results from every source, ranked by relevance. Each result shows the asset type, name, source, and a snippet. Your agent — or you — can load the full content:
72
+
73
+ ```sh
74
+ akm show skill:deploy-to-production
75
+ ```
76
+
77
+ Only the skill you need gets loaded into context. Everything else stays out.
78
+
79
+ ## Tell Your Agent About It
80
+
81
+ Here's the part that ties it all together. Drop this into your `AGENTS.md`, `CLAUDE.md`, or system prompt:
82
+
83
+ ```markdown
84
+ ## Resources & Capabilities
85
+
86
+ Search for skills, commands, and knowledge using `akm search <query>`.
87
+ View full details with `akm show <ref>`.
88
+ ```
89
+
90
+ That's the entire integration. No plugins, no SDKs, no integration code. Any model that can run shell commands can use `akm`. Claude Code, Codex, Cursor — if it has a terminal, it works.
91
+
92
+ The agent runs `akm search` to find what it needs, `akm show` to load the content, and gets to work. Everything else stays out of context. Progressive disclosure — the agent discovers what exists, then activates only what it needs. If that pattern sounds familiar, I covered the architecture behind it in [part one](https://dev.to/itlackey/your-ai-agents-skill-list-is-getting-out-of-hand-32ck).
93
+
94
+ ## What's Next
95
+
96
+ This post covered the individual developer workflow — one person, multiple tools, skills everywhere. But what happens when a team of five developers each has their own skills across three platforms? That's where things get interesting, and where akm's source model, Git integration, and private registry support come into play.
97
+
98
+ For now: install akm, point it at your directories, and run `akm search`. You'll be surprised how many skills you already have.
99
+
100
+ Give it a look at [github.com/itlackey/akm](https://github.com/itlackey/akm). If you've got agent assets scattered across platforms, give it a shot and let me know what breaks.
@@ -0,0 +1,222 @@
1
+ ---
2
+ title: 'Task Assets: Agent Workflows That Run While You Sleep'
3
+ cover_image: 'https://raw.githubusercontent.com/itlackey/akm/main/docs/posts/akm-logo-sized.webp'
4
+ series: akm-knowledge
5
+ description: 'Task assets in akm 0.8.0 are the first-class way to define persistent, scheduled agent workflows. This post covers the YAML schema, scheduling, manual invocation, environment injection, and logging — with the Discord health report as a worked example.'
6
+ tags:
7
+ - ai
8
+ - agents
9
+ - cli
10
+ - automation
11
+ published: true
12
+ id: 3814542
13
+ date: '2026-06-04T00:32:02Z'
14
+ ---
15
+
16
+ > This is a dated article from AKM's publishing archive. For current product behavior, see the
17
+ > [documentation index](https://github.com/itlackey/akm/blob/main/docs/README.md).
18
+
19
+ This is part eleven in a series about managing the growing pile of skills, scripts, and context that AI coding agents depend on. [Part nine](https://dev.to/itlackey/agents-that-remember-where-they-were-1koe) covered workflow assets and resumable procedures. [Part ten](https://dev.to/itlackey/the-improvement-loop-how-akm-keeps-your-agent-sharp-2d4d) introduced the improve pipeline that continuously curates your stash. Earlier parts addressed teams, distributed stashes, and community knowledge.
20
+
21
+ Most automation with AI agents is reactive. You open a session, give the agent a task, wait for the result, close the session. The agent's clock runs when you run it.
22
+
23
+ Task assets flip that model. A task is a YAML file in your stash that defines a workflow — what to run, when to run it, what environment it needs, and how long it's allowed to take. Once registered, the task runs on schedule without your involvement. The OS scheduler calls `akm tasks run <id>`, which executes the task and writes the result to `state.db`. You find out what happened when you check `akm health` or look at the log.
24
+
25
+ This is the piece of akm 0.8.0 that makes continuous operation possible. The improve loop runs twice an hour because a task asset says it does. The hourly Discord health report fires because a task asset says it does. Neither requires an open terminal.
26
+
27
+ ## The Task Asset Format
28
+
29
+ Task assets live at `<stash>/tasks/<id>.yml`. The filename is the task ID. A minimal task looks like this:
30
+
31
+ ```yaml
32
+ schedule: 0 * * * *
33
+ command: akm improve --auto-accept 90 # doclint:ignore (historical — akm 0.8.0-era task assets post; `--auto-accept` removed in 0.9.0)
34
+ enabled: true
35
+ ```
36
+
37
+ That's enough to install a cron entry and run `akm improve` at the top of every hour. The full schema adds metadata and per-task timeout control:
38
+
39
+ ```yaml
40
+ schedule: "7,37 * * * *"
41
+ command: akm improve --auto-accept 90 --timeout-ms 1620000 # doclint:ignore (historical — akm 0.8.0-era task assets post; `--auto-accept` removed in 0.9.0)
42
+ enabled: true
43
+ timeoutMs: 1800000
44
+ name: akm-improve
45
+ description: Run the improve pass at :07 and :37 — reflect, distill, consolidate, lint, and eval.
46
+ when_to_use: Twice per hour; leaves ~23 minutes of idle headroom between completions.
47
+ tags:
48
+ - improve
49
+ - maintenance
50
+ ```
51
+
52
+ The fields that matter most:
53
+
54
+ | Field | Required | Purpose |
55
+ |---|---|---|
56
+ | `schedule` | yes | Standard cron expression. Maps to crontab on Linux, launchd plist on macOS, schtasks XML on Windows. Wrap expressions containing special characters in quotes. |
57
+ | `command` or `prompt` | one of the two | `command` runs as a plain shell command. `prompt` dispatches through the configured agent profile. A third option, `workflow`, targets a stash workflow ref directly. |
58
+ | `enabled` | yes | `false` keeps the task definition in your stash without installing a scheduler entry. |
59
+ | `timeoutMs` | no | Per-task timeout in milliseconds, overriding whatever the agent profile sets globally. `null` removes the kill timer entirely — useful for long-running local-model tasks. |
60
+ | `name`, `description`, `when_to_use`, `tags` | no | Metadata. `name` appears in `akm show` and search results; the others exist for your own records and for search. |
61
+
62
+ ## command: vs prompt:
63
+
64
+ The distinction between `command` and `prompt` reflects two different execution models.
65
+
66
+ A `command` task is a shell invocation. `akm tasks run` executes the string directly in a child process. There is no agent involved. The command can call `akm`, run a shell script, invoke any binary. The exit code is what gets logged.
67
+
68
+ ```yaml
69
+ command: akm improve --auto-accept 90 # doclint:ignore (historical — akm 0.8.0-era task assets post; `--auto-accept` removed in 0.9.0)
70
+ ```
71
+
72
+ A `prompt` task dispatches to the agent configured in your default agent profile (or the profile specified in `--profile`). The value of `prompt` becomes the task instruction. The agent runs autonomously, can use `akm` commands, write files, and call tools according to its allowed tool set. The result is determined by whether the agent exits cleanly.
73
+
74
+ ```yaml
75
+ prompt: |
76
+ Run akm wiki ingest research and then run akm wiki lint research.
77
+ Fix any orphan pages the lint step reports.
78
+ ```
79
+
80
+ The practical split: use `command` for tasks where the execution is fully scripted and the outcome is deterministic. Use `prompt` when you want the agent to exercise judgment — synthesizing content, triaging output, making decisions based on what it finds. The curate-to-wiki task is a good example of the latter: it runs a multi-step workflow where the agent reads each step's instructions, substitutes parameters, and advances the workflow run through to completion. Workflow assets themselves are covered in [part nine](https://dev.to/itlackey/agents-that-remember-where-they-were-1koe) of this series.
81
+
82
+ ## Registering Tasks
83
+
84
+ There are two ways to get a task into the scheduler.
85
+
86
+ The first way is `akm tasks add`, which creates the YAML file and installs it in one step:
87
+
88
+ ```sh
89
+ akm tasks add my-task \
90
+ --schedule "0 9 * * *" \
91
+ --command "akm improve --auto-accept 80" \
92
+ --name "Morning improve pass" \
93
+ --description "Daily improve at 9 AM"
94
+ ```
95
+
96
+ The second way is to write the YAML file directly into your stash's `tasks/` directory and then call:
97
+
98
+ ```sh
99
+ akm tasks sync # doclint:ignore (`tasks` was renamed to singular `task` in 0.9.0)
100
+ ```
101
+
102
+ `sync` reconciles all `.yml` files in `tasks/` against the OS scheduler. Any task that's `enabled: true` and not yet installed gets a scheduler entry. Any task that's `enabled: false` or missing gets its entry removed. This is the right command to run after pulling stash changes that include new or updated task files.
103
+
104
+ Other task management commands:
105
+
106
+ ```sh
107
+ akm search --type task # all defined tasks (any bundle)
108
+ akm show tasks/<id> # parsed YAML + scheduler state
109
+ akm tasks run <id> # execute immediately # doclint:ignore (`tasks` renamed `task` in 0.9.0)
110
+ akm tasks enable <id> # install the scheduler entry # doclint:ignore (`tasks enable` removed in 0.9.0; use a file edit + `task sync`)
111
+ akm tasks disable <id> # remove the scheduler entry, keep the file # doclint:ignore (`tasks disable` removed in 0.9.0; use a file edit + `task sync`)
112
+ akm tasks history [--id <id>] # recent runs from state.db # doclint:ignore (`tasks` renamed `task` in 0.9.0)
113
+ akm tasks doctor # scheduler backend + cron path # doclint:ignore (`tasks` renamed `task` in 0.9.0)
114
+ ```
115
+
116
+ To unschedule a task entirely, delete its `.yml` from the bundle and run `akm
117
+ tasks sync` (which uninstalls scheduler entries that no longer have a backing
118
+ file). `enable`, `disable`, `run`, and `sync` also accept `--target <bundle>`
119
+ to act on a task that lives in a non-default bundle.
120
+
121
+ `akm tasks run` is the same command the scheduler calls. You can run a task immediately to test it before committing it to a schedule.
122
+
123
+ ## Environment Injection with akm env run
124
+
125
+ Tasks that need secrets or environment-specific configuration use `akm env`. An env asset is an encrypted `.env` file stored in your stash under `env/<name>.env`. You inject it into a child process using `akm env run`:
126
+
127
+ ```sh
128
+ akm env run env:fwdslsh -- bash ./scripts/post-to-discord.sh
129
+ ```
130
+
131
+ The `env:` prefix is the canonical ref form. In task YAML, akm also resolves bare env names — the worked example below uses the bare name to match the production file exactly.
132
+
133
+ In a task `command` field, the same pattern applies directly:
134
+
135
+ ```yaml
136
+ command: akm env run fwdslsh -- bash /home/founder3/akm/scripts/akm-health-discord.sh
137
+ ```
138
+
139
+ This injects every variable in the `fwdslsh` environment group into the shell process that runs the script. The variables live only in that child process — they are never written to disk or exported to the parent environment. The task definition itself contains no secrets, only the environment group reference. You can commit task YAML to your stash and share it without exposing credentials.
140
+
141
+ If a task needs only a subset of the environment group variables, `--only` narrows the injection:
142
+
143
+ ```sh
144
+ akm env run env:fwdslsh --only DISCORD_WEBHOOK_URL -- bash ./post.sh
145
+ ```
146
+
147
+ `--only` accepts a single key or a comma-separated list. Use `--except` to inject everything in the environment group except specific keys.
148
+
149
+ ## Worked Example: The Discord Health Report
150
+
151
+ This is the health report task used in production to monitor the improve pipeline:
152
+
153
+ ```yaml
154
+ # ~/akm/tasks/akm-health-report.yml
155
+ schedule: 0 * * * *
156
+ command: akm env run fwdslsh -- bash /home/founder3/akm/scripts/akm-health-discord.sh
157
+ enabled: true
158
+ name: AKM Health Report → Discord
159
+ description: "Hourly: post a 4h rolling health report to Discord. Driven by
160
+ akm health --since=4h — same data source as manual reports."
161
+ tags:
162
+ - health
163
+ - discord
164
+ - monitoring
165
+ ```
166
+
167
+ The task fires at the top of every hour. It injects the `fwdslsh` environment group (which contains the Discord webhook URL and any other credentials the script needs), then runs the health report script. The script calls `akm health --since=4h` and `akm health --since=8h`, computes deltas between the two windows for trend context, and posts a formatted embed to Discord.
168
+
169
+ The embed has three inline fields — Output (promoted refs, merged memories, memory inference yield), Failures (chunk failures, skip reason anomalies), and Latency (median, P95, prior-window comparison) — plus a Needs Attention section that only appears when something is actually off. The footer includes the hostname and run timestamp so reports from multiple machines are distinguishable at a glance.
170
+
171
+ To register the task after writing the YAML:
172
+
173
+ ```sh
174
+ akm tasks sync # doclint:ignore (`tasks` was renamed to singular `task` in 0.9.0)
175
+ # → installed: akm-health-report
176
+ ```
177
+
178
+ Run it once immediately to confirm the script works before relying on the scheduled version:
179
+
180
+ ```sh
181
+ akm tasks run akm-health-report # doclint:ignore (`tasks` was renamed to singular `task` in 0.9.0)
182
+ ```
183
+
184
+ Check the result:
185
+
186
+ ```sh
187
+ akm tasks history --id akm-health-report --limit 5 # doclint:ignore (`tasks` was renamed to singular `task` in 0.9.0)
188
+ ```
189
+
190
+ ## Logging
191
+
192
+ Every task run is recorded in `state.db` under the `task_history` table. `akm tasks history` surfaces that data. For log output, each run writes to:
193
+
194
+ ```
195
+ ~/.cache/akm/tasks/logs/<id>.log
196
+ ```
197
+
198
+ `akm health` inspects `task_history` for missing log files, stale active runs (tasks that started but never completed), and recent failure rates. A task run that never wrote a `tasks_completed` event shows up in `akm health` output as a stuck active run — a reliable signal that something went wrong even if the log file doesn't say much.
199
+
200
+ ```sh
201
+ akm health --since 4h
202
+ ```
203
+
204
+ The health check correlates the `task_history` events with the log files on disk. If a log file is missing for a completed run, `logBackingRate` drops below 1.0, which flags as a warning. This is the `task-log-backing` hard check — one of the deterministic checks that `akm health` runs before it looks at any metrics.
205
+
206
+ ## Building a Task-Driven Operation
207
+
208
+ The pattern that emerges from several tasks working together is an operation that runs itself. The improve loop consolidates and curates the stash twice an hour — what that pipeline does internally is covered in [part ten](https://dev.to/itlackey/the-improvement-loop-how-akm-keeps-your-agent-sharp-2d4d). The health report surfaces the results every hour. A daily curation task pulls new articles from configured sources and ingests them into the research wiki. None of these require an open terminal.
209
+
210
+ Adding a new automated behavior follows the same steps regardless of what the task does:
211
+
212
+ 1. Write the YAML to `<stash>/tasks/<id>.yml`.
213
+ 2. Run `akm tasks sync` to install the scheduler entry.
214
+ 3. Run `akm tasks run <id>` to test it immediately.
215
+ 4. Confirm the output with `akm tasks history` and check the log.
216
+ 5. Add the task file to git if you want it version-controlled with your stash.
217
+
218
+ The task YAML is the contract between what you want to happen and when it happens. The log and `state.db` are the record of what actually did.
219
+
220
+ ---
221
+
222
+ Task assets are available in akm 0.8.0. The full command reference is in [Tasks](../reference/tasks.md). The environment vault documentation is in [Environment & Secrets](../reference/env-and-secrets.md). If you're upgrading from 0.7.x, task `.md` files from the old format are not auto-discovered — check the migration guide for the conversion path.