akm-cli 0.9.1 → 0.9.2-alpha.2

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 (350) hide show
  1. package/CHANGELOG.md +103 -28
  2. package/README.md +3 -1
  3. package/SECURITY.md +1 -1
  4. package/STABILITY.md +1 -1
  5. package/dist/akm +2 -2
  6. package/dist/akm-migrate +2 -2
  7. package/dist/assets/hints/cli-hints-full.md +14 -9
  8. package/dist/assets/improve-strategies/proactive-maintenance.json +1 -1
  9. package/dist/assets/improve-strategies/reflect-distill.json +1 -1
  10. package/dist/assets/models.json +35 -0
  11. package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +3 -4
  12. package/dist/assets/stash-skeleton/facts/conventions/organization.md +1 -3
  13. package/dist/assets/tasks/core/extract.yml +6 -5
  14. package/dist/assets/tasks/core/improve.yml +6 -5
  15. package/dist/assets/tasks/core/index-refresh.yml +6 -5
  16. package/dist/assets/tasks/core/sync.yml +6 -5
  17. package/dist/assets/tasks/core/version-check.yml +6 -5
  18. package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +6 -5
  19. package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -5
  20. package/dist/assets/tasks/improve/akm-improve-consolidate.yml +6 -5
  21. package/dist/assets/tasks/improve/akm-improve-frequent.yml +6 -5
  22. package/dist/assets/tasks/improve/akm-improve-nightly.yml +6 -5
  23. package/dist/cli/confirm.js +2 -2
  24. package/dist/cli/parse-args.js +3 -24
  25. package/dist/cli/retired-commands.js +1 -1
  26. package/dist/cli/shared.js +2 -2
  27. package/dist/cli.js +11 -9
  28. package/dist/commands/agent/agent-dispatch.js +55 -89
  29. package/dist/commands/agent/contribute-cli.js +12 -45
  30. package/dist/commands/command/builtin-action.js +32 -0
  31. package/dist/commands/command/command-cli.js +99 -0
  32. package/dist/commands/command/command-execution.js +308 -0
  33. package/dist/commands/command/execution-source-loader.js +176 -0
  34. package/dist/commands/command/portable-template.js +60 -0
  35. package/dist/commands/config-cli.js +10 -4
  36. package/dist/commands/env/env.js +4 -2
  37. package/dist/commands/feedback-cli.js +1 -1
  38. package/dist/commands/health/checks.js +241 -29
  39. package/dist/commands/health/html-report.js +0 -14
  40. package/dist/commands/health/report-view-model.js +0 -1
  41. package/dist/commands/health/surfaces.js +6 -7
  42. package/dist/commands/health/types.js +0 -2
  43. package/dist/commands/health.js +63 -18
  44. package/dist/commands/improve/collapse-detector.js +5 -6
  45. package/dist/commands/improve/consolidate.js +251 -214
  46. package/dist/commands/improve/distill/promote-memory.js +71 -34
  47. package/dist/commands/improve/distill/quality-gate.js +17 -5
  48. package/dist/commands/improve/distill.js +232 -155
  49. package/dist/commands/improve/eligibility.js +112 -79
  50. package/dist/commands/improve/execution.js +57 -0
  51. package/dist/commands/improve/extract-cli.js +5 -5
  52. package/dist/commands/improve/extract-prompt.js +64 -22
  53. package/dist/commands/improve/extract.js +608 -360
  54. package/dist/commands/improve/improve-strategies.js +43 -14
  55. package/dist/commands/improve/improve.js +249 -29
  56. package/dist/commands/improve/loop-stages.js +11 -17
  57. package/dist/commands/improve/memory/memory-contradiction-detect.js +90 -66
  58. package/dist/commands/improve/outcome-loop.js +22 -38
  59. package/dist/commands/improve/planner.js +134 -0
  60. package/dist/commands/improve/preparation.js +730 -409
  61. package/dist/commands/improve/reflect.js +386 -223
  62. package/dist/commands/improve/run-context.js +3 -4
  63. package/dist/commands/improve/salience.js +6 -58
  64. package/dist/commands/improve/session-asset.js +12 -12
  65. package/dist/commands/lint/index.js +101 -29
  66. package/dist/commands/migrate-cli.js +11 -69
  67. package/dist/commands/migration-tool.js +6 -9
  68. package/dist/commands/models-cli.js +27 -0
  69. package/dist/commands/proposal/drain.js +258 -186
  70. package/dist/commands/proposal/proposal-cli.js +32 -10
  71. package/dist/commands/proposal/proposal.js +2 -5
  72. package/dist/commands/proposal/propose.js +192 -172
  73. package/dist/commands/proposal/repository.js +54 -91
  74. package/dist/commands/proposal/validators/proposal-validators.js +9 -7
  75. package/dist/commands/read/curate.js +53 -22
  76. package/dist/commands/read/registry-search.js +25 -9
  77. package/dist/commands/read/remember-cli.js +14 -2
  78. package/dist/commands/read/search.js +10 -4
  79. package/dist/commands/read/show.js +139 -153
  80. package/dist/commands/registry-cli.js +16 -7
  81. package/dist/commands/remember.js +33 -18
  82. package/dist/commands/sources/add-cli.js +19 -178
  83. package/dist/commands/sources/bundle-cli.js +15 -3
  84. package/dist/commands/sources/dangerous-env-audit.js +135 -0
  85. package/dist/commands/sources/info.js +2 -1
  86. package/dist/commands/sources/installed-stashes.js +901 -177
  87. package/dist/commands/sources/schema-repair.js +174 -95
  88. package/dist/commands/sources/self-update.js +30 -74
  89. package/dist/commands/sources/source-add.js +3 -5
  90. package/dist/commands/sources/sources-cli.js +2 -15
  91. package/dist/commands/sources/update-transaction.js +220 -0
  92. package/dist/commands/tasks/tasks-cli.js +3 -3
  93. package/dist/commands/tasks/tasks.js +736 -317
  94. package/dist/commands/workflow-cli.js +2 -2
  95. package/dist/core/adapter/adapters/agent-skills-adapter.js +3 -0
  96. package/dist/core/adapter/adapters/akm-adapter.js +85 -35
  97. package/dist/core/adapter/adapters/akm-lint.js +54 -39
  98. package/dist/core/adapter/adapters/akm-metadata.js +45 -45
  99. package/dist/core/adapter/adapters/akm-task-adapter.js +32 -49
  100. package/dist/core/adapter/adapters/akm-workflow-adapter.js +38 -23
  101. package/dist/core/adapter/adapters/dotenv-adapter.js +30 -1
  102. package/dist/core/adapter/adapters/generic-files-adapter.js +11 -0
  103. package/dist/core/adapter/adapters/index.js +0 -9
  104. package/dist/core/adapter/adapters/llm-wiki-adapter.js +4 -0
  105. package/dist/core/adapter/adapters/okf-adapter.js +4 -0
  106. package/dist/core/adapter/adapters/opencode-adapter.js +5 -8
  107. package/dist/core/adapter/adapters/tool-dir-shared.js +63 -6
  108. package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -0
  109. package/dist/core/adapter/execution-source.js +308 -0
  110. package/dist/core/adapter/recognize-match.js +36 -13
  111. package/dist/core/adapter/registry.js +0 -9
  112. package/dist/core/asset/stash-meta.js +94 -4
  113. package/dist/core/common.js +6 -11
  114. package/dist/core/config/config-io.js +3 -3
  115. package/dist/core/config/config-schema.js +18 -40
  116. package/dist/core/config/config-sources.js +11 -21
  117. package/dist/core/config/config-walker.js +31 -13
  118. package/dist/core/config/config.js +23 -26
  119. package/dist/core/config/schema/engines.js +8 -7
  120. package/dist/core/config/schema/improve-processes.js +29 -5
  121. package/dist/core/config/schema/index-config.js +0 -27
  122. package/dist/core/config/schema/primitives.js +1 -23
  123. package/dist/core/config/schema/sources-bundles.js +13 -16
  124. package/dist/core/errors.js +2 -0
  125. package/dist/core/events.js +68 -32
  126. package/dist/core/extra-params.js +1 -0
  127. package/dist/core/improve-result.js +315 -0
  128. package/dist/core/lesson-lint.js +0 -6
  129. package/dist/core/maintenance-barrier.js +4 -4
  130. package/dist/core/network-policy.js +152 -0
  131. package/dist/core/paths.js +1 -1
  132. package/dist/core/recognition-util.js +4 -4
  133. package/dist/core/registry-url.js +456 -0
  134. package/dist/core/state/migrations.js +161 -47
  135. package/dist/core/state-db.js +453 -80
  136. package/dist/core/system-error.js +32 -0
  137. package/dist/core/time.js +2 -12
  138. package/dist/core/write-source.js +0 -18
  139. package/dist/execution/directory-identity.js +52 -0
  140. package/dist/execution/executable-identity.js +107 -0
  141. package/dist/execution/guarded-source.js +398 -0
  142. package/dist/execution/json.js +95 -0
  143. package/dist/{commands/health/types-session-log.js → execution/limits.js} +2 -1
  144. package/dist/execution/record.js +55 -0
  145. package/dist/execution/resolved-request.js +730 -0
  146. package/dist/execution/source.js +320 -0
  147. package/dist/indexer/bundle-identity-guard.js +5 -4
  148. package/dist/indexer/db/graph-db.js +33 -0
  149. package/dist/indexer/graph/graph-boost.js +3 -4
  150. package/dist/indexer/graph/graph-extraction.js +562 -373
  151. package/dist/indexer/index-written-assets.js +78 -39
  152. package/dist/indexer/indexer.js +471 -432
  153. package/dist/indexer/installations.js +6 -0
  154. package/dist/indexer/lookup/adapter-concept-owner.js +283 -0
  155. package/dist/indexer/materialize-embeddings.js +155 -0
  156. package/dist/indexer/passes/memory-inference.js +227 -174
  157. package/dist/indexer/passes/metadata.js +263 -118
  158. package/dist/indexer/scan/doc-to-entry.js +7 -10
  159. package/dist/indexer/scan/drain-dir.js +51 -23
  160. package/dist/indexer/search/db-search.js +156 -50
  161. package/dist/indexer/search/fts-query.js +40 -40
  162. package/dist/indexer/search/ranking.js +36 -1
  163. package/dist/indexer/search/search-attribution.js +3 -1
  164. package/dist/indexer/search/search-fields.js +23 -14
  165. package/dist/indexer/search/search-hit-enrichers.js +1 -1
  166. package/dist/indexer/search/search-source.js +7 -16
  167. package/dist/indexer/search/semantic-status.js +10 -1
  168. package/dist/indexer/usage/show-usage.js +105 -0
  169. package/dist/indexer/usage/usage-events.js +7 -2
  170. package/dist/indexer/walk/matchers.js +40 -10
  171. package/dist/indexer/walk/path-resolver.js +5 -2
  172. package/dist/indexer/walk/walker.js +20 -2
  173. package/dist/integrations/agent/builder-shared.js +3 -6
  174. package/dist/integrations/agent/conversation-fallback.js +16 -0
  175. package/dist/integrations/agent/engine-resolution.js +87 -87
  176. package/dist/integrations/agent/execution-cascade.js +566 -0
  177. package/dist/integrations/agent/execution-definitions.js +211 -0
  178. package/dist/integrations/agent/execution-lowering.js +811 -0
  179. package/dist/integrations/agent/execution-preparation.js +67 -0
  180. package/dist/integrations/agent/index.js +0 -2
  181. package/dist/integrations/agent/inline-execution.js +74 -0
  182. package/dist/integrations/agent/model-map.js +515 -0
  183. package/dist/integrations/agent/persona-fallback.js +30 -0
  184. package/dist/integrations/agent/request-lowering.js +186 -0
  185. package/dist/integrations/agent/runner-dispatch.js +230 -37
  186. package/dist/integrations/agent/runner.js +12 -83
  187. package/dist/integrations/harnesses/aider/agent-builder.js +8 -0
  188. package/dist/integrations/harnesses/aider/index.js +0 -1
  189. package/dist/integrations/harnesses/amazonq/agent-builder.js +8 -0
  190. package/dist/integrations/harnesses/amazonq/index.js +0 -1
  191. package/dist/integrations/harnesses/claude/agent-builder.js +14 -1
  192. package/dist/integrations/harnesses/claude/index.js +1 -5
  193. package/dist/integrations/harnesses/claude/session-log.js +3 -33
  194. package/dist/integrations/harnesses/codex/agent-builder.js +8 -0
  195. package/dist/integrations/harnesses/codex/index.js +0 -1
  196. package/dist/integrations/harnesses/copilot/agent-builder.js +8 -0
  197. package/dist/integrations/harnesses/copilot/index.js +0 -1
  198. package/dist/integrations/harnesses/gemini/agent-builder.js +8 -0
  199. package/dist/integrations/harnesses/gemini/index.js +0 -1
  200. package/dist/integrations/harnesses/index.js +4 -44
  201. package/dist/integrations/harnesses/opencode/agent-builder.js +16 -9
  202. package/dist/integrations/harnesses/opencode/index.js +0 -2
  203. package/dist/integrations/harnesses/opencode/session-log.js +14 -204
  204. package/dist/integrations/harnesses/opencode-sdk/harness.js +12 -1
  205. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +40 -42
  206. package/dist/integrations/harnesses/openhands/agent-builder.js +8 -0
  207. package/dist/integrations/harnesses/openhands/index.js +0 -1
  208. package/dist/integrations/harnesses/pi/agent-builder.js +8 -0
  209. package/dist/integrations/harnesses/pi/index.js +0 -1
  210. package/dist/integrations/harnesses/shared.js +0 -1
  211. package/dist/integrations/harnesses/types.js +1 -3
  212. package/dist/integrations/lockfile.js +82 -79
  213. package/dist/integrations/session-logs/index.js +6 -17
  214. package/dist/integrations/session-logs/provider-base.js +1 -29
  215. package/dist/llm/client.js +10 -5
  216. package/dist/llm/embedder.js +6 -7
  217. package/dist/llm/embedders/local.js +37 -88
  218. package/dist/llm/embedders/types.js +1 -1
  219. package/dist/llm/graph-extract.js +75 -50
  220. package/dist/llm/index-passes.js +43 -5
  221. package/dist/llm/memory-infer.js +8 -6
  222. package/dist/llm/metadata-enhance.js +5 -3
  223. package/dist/llm/structured-call.js +122 -25
  224. package/dist/output/format-exempt.js +1 -1
  225. package/dist/output/render-registry.js +0 -16
  226. package/dist/output/renderers.js +12 -7
  227. package/dist/output/shapes/curate.js +1 -0
  228. package/dist/output/shapes/helpers.js +10 -2
  229. package/dist/output/shapes/passthrough.js +2 -0
  230. package/dist/output/text/command-format.js +31 -33
  231. package/dist/output/text/health-format.js +1 -29
  232. package/dist/output/text/migrate.js +6 -56
  233. package/dist/output/text/proposal-format.js +16 -1
  234. package/dist/output/text/workflow-format.js +16 -0
  235. package/dist/registry/network.js +279 -0
  236. package/dist/registry/pinned-request-helper.js +247 -0
  237. package/dist/registry/pinned-transport.js +717 -0
  238. package/dist/registry/providers/skills-sh.js +18 -6
  239. package/dist/registry/providers/static-index.js +20 -7
  240. package/dist/registry/resolve.js +53 -28
  241. package/dist/scripts/akm-migrate-node.js +19334 -52269
  242. package/dist/scripts/akm-migrate.js +19270 -51612
  243. package/dist/setup/registry-stash-loader.js +64 -20
  244. package/dist/setup/semantic-assets.js +9 -34
  245. package/dist/setup/setup.js +12 -30
  246. package/dist/setup/source-identity.js +17 -0
  247. package/dist/setup/steps/sources.js +36 -15
  248. package/dist/setup/steps/tasks.js +39 -11
  249. package/dist/sources/providers/git-provider.js +3 -3
  250. package/dist/sources/providers/npm.js +2 -2
  251. package/dist/sources/providers/provider-utils.js +4 -3
  252. package/dist/sources/providers/website.js +11 -7
  253. package/dist/sources/snapshot-fetchers/host-guard.js +9 -136
  254. package/dist/sources/snapshot-fetchers/website-ingest.js +25 -109
  255. package/dist/sources/website-url.js +73 -0
  256. package/dist/storage/engines/sqlite-migrations.js +81 -26
  257. package/dist/storage/managed-db.js +27 -24
  258. package/dist/storage/repositories/events-repository.js +3 -0
  259. package/dist/storage/repositories/index-connection.js +42 -10
  260. package/dist/storage/repositories/index-entries-repository.js +203 -229
  261. package/dist/storage/repositories/index-entry-mapper.js +8 -12
  262. package/dist/storage/repositories/index-entry-schema.js +255 -0
  263. package/dist/storage/repositories/index-fts-repository.js +64 -71
  264. package/dist/storage/repositories/index-llm-cache-repository.js +8 -13
  265. package/dist/storage/repositories/index-meta-repository.js +0 -11
  266. package/dist/storage/repositories/index-schema.js +74 -350
  267. package/dist/storage/repositories/index-utility-repository.js +12 -17
  268. package/dist/storage/repositories/index-vec-repository.js +56 -7
  269. package/dist/storage/repositories/proposals-repository.js +4 -127
  270. package/dist/storage/repositories/registry-cache.js +2 -1
  271. package/dist/storage/repositories/task-history-repository.js +20 -40
  272. package/dist/storage/repositories/workflow-runs-repository.js +228 -129
  273. package/dist/storage/sqlite-read-snapshot.js +148 -0
  274. package/dist/tasks/backends/cron.js +170 -42
  275. package/dist/tasks/backends/index.js +1 -1
  276. package/dist/tasks/backends/launchd.js +787 -202
  277. package/dist/tasks/backends/schtasks.js +282 -83
  278. package/dist/tasks/embedded.js +7 -7
  279. package/dist/tasks/frozen-script.js +50 -0
  280. package/dist/tasks/resolve-akm-bin.js +5 -1
  281. package/dist/tasks/runner.js +239 -251
  282. package/dist/tasks/runtime-v3.js +281 -0
  283. package/dist/tasks/scheduler-binding.js +272 -0
  284. package/dist/tasks/scheduler-invocation.js +57 -43
  285. package/dist/tasks/scheduler-sync.js +654 -0
  286. package/dist/tasks/source-v3.js +752 -0
  287. package/dist/tasks/standalone-script-entry.js +5 -0
  288. package/dist/tasks/task-id.js +29 -0
  289. package/dist/workflows/authoring/authoring.js +15 -32
  290. package/dist/workflows/exec/dispatch-redaction.js +14 -8
  291. package/dist/workflows/exec/exec-unit.js +7 -28
  292. package/dist/workflows/exec/frozen-judge.js +57 -89
  293. package/dist/workflows/exec/lowering-notices.js +23 -0
  294. package/dist/workflows/exec/native-executor.js +301 -458
  295. package/dist/workflows/exec/param-secrets.js +4 -3
  296. package/dist/workflows/exec/run-workflow.js +26 -32
  297. package/dist/workflows/exec/step-work.js +105 -109
  298. package/dist/workflows/exec/unit-dispatch.js +103 -27
  299. package/dist/workflows/exec/unit-writer.js +3 -3
  300. package/dist/workflows/exec/worktree.js +2 -2
  301. package/dist/workflows/ir/compile.js +86 -72
  302. package/dist/workflows/ir/environment-v4.js +328 -0
  303. package/dist/workflows/ir/freeze-v4.js +122 -0
  304. package/dist/workflows/ir/plan-hash.js +13 -7
  305. package/dist/workflows/ir/schema-v4.js +525 -0
  306. package/dist/workflows/ir/schema.js +25 -284
  307. package/dist/workflows/ir/source-freeze-v4.js +506 -0
  308. package/dist/workflows/parser.js +27 -24
  309. package/dist/workflows/program/schema.js +1 -2
  310. package/dist/workflows/renderer.js +42 -29
  311. package/dist/workflows/resource-limits.js +4 -5
  312. package/dist/workflows/runtime/agent-identity.js +11 -13
  313. package/dist/workflows/runtime/plan-classifier.js +8 -8
  314. package/dist/workflows/runtime/runs.js +27 -43
  315. package/dist/workflows/runtime/workflow-asset-loader.js +45 -205
  316. package/dist/workflows/source-files.js +373 -0
  317. package/dist/workflows/source-ir/compile.js +196 -0
  318. package/dist/workflows/source-ir/github-yaml.js +577 -0
  319. package/dist/workflows/source-ir/ordering.js +38 -0
  320. package/dist/workflows/source-ir/program.js +50 -0
  321. package/dist/workflows/source-ir/result.js +26 -0
  322. package/dist/workflows/source-ir/schema.js +772 -0
  323. package/dist/workflows/source-ir/semantics.js +242 -0
  324. package/dist/workflows/source-ir/uses.js +14 -0
  325. package/docs/README.md +2 -0
  326. package/docs/migration/README.md +3 -1
  327. package/docs/migration/release-notes/0.9.2.md +55 -0
  328. package/docs/migration/release-notes/README.md +5 -0
  329. package/docs/migration/v0.8-to-v0.9.md +76 -1077
  330. package/docs/migration/v0.9.0-troubleshooting.md +104 -516
  331. package/docs/migration/v0.9.1-to-v0.9.2.md +150 -0
  332. package/docs/reference/README.md +1 -0
  333. package/docs/reference/cli.md +230 -98
  334. package/docs/reference/configuration.md +159 -36
  335. package/docs/reference/data-and-telemetry.md +19 -1
  336. package/docs/reference/supported-formats.md +23 -3
  337. package/docs/reference/tasks.md +182 -0
  338. package/docs/reference/workflow-schema.md +91 -40
  339. package/docs/reference/workflows.md +33 -6
  340. package/package.json +10 -6
  341. package/schemas/akm-config.json +372 -224
  342. package/schemas/akm-task.json +324 -80
  343. package/schemas/akm-workflow.json +6 -9
  344. package/dist/core/migration-operation.js +0 -75
  345. package/dist/integrations/agent/model-aliases.js +0 -74
  346. package/dist/tasks/parser.js +0 -380
  347. package/dist/tasks/schema.js +0 -123
  348. package/dist/tasks/validator.js +0 -80
  349. package/dist/workflows/ir/freeze.js +0 -320
  350. package/dist/workflows/runtime/document-cache.js +0 -13
@@ -9,22 +9,10 @@ directory. Project `.akm/config.json` files are not merged.
9
9
 
10
10
  A present configuration file must set `configVersion` to exactly `"0.9.0"`.
11
11
  Missing, older, newer, numeric, and malformed versions are rejected by ordinary
12
- commands without rewriting the file. `akm migrate status` reports config and
13
- database state independently; it exits nonzero when migration is blocked.
14
- `akm migrate apply` installs an operator-prepared 0.9 config and applies pending
15
- database migrations, but it never guesses profile-to-engine mappings. See [the
16
- migration guide](../migration/v0.8-to-v0.9.md) before editing an existing
17
- installation.
18
-
19
- Canonical config and durable database access fail closed while a restore or
20
- migration-apply operation is incomplete. Use `akm migrate status` to inspect it
21
- and `akm migrate apply` to retry; do not delete migration control files manually.
22
-
23
- AKM 0.8 does not provide these migration commands. To cross from 0.8 to 0.9,
24
- prepare the target and an independent filesystem backup first, install or stage
25
- the 0.9 binary manually, then invoke that new binary with `migrate apply
26
- --config`. Do not use `upgrade --migration-config` from 0.8; that installed 0.8
27
- code cannot enforce safeguards introduced by 0.9.
12
+ commands without rewriting the file. Pre-0.9 config and database layouts are
13
+ not runtime inputs and are not migrated by `akm upgrade`. Configure the current
14
+ schema directly. The standalone migrator exists only for explicit task v2 to
15
+ task v3 conversion.
28
16
 
29
17
  ```jsonc
30
18
  {
@@ -80,8 +68,17 @@ LLM endpoints must be complete `http://` or `https://` chat-completions URLs
80
68
  ending in `/chat/completions`, without userinfo, query, or fragment. API keys
81
69
  are symbolic only: `$VAR` or `${VAR}`. AKM resolves them only at dispatch.
82
70
 
83
- An agent engine may set `bin`, `args`, `workspace`, `model`, `timeoutMs`, and
84
- `modelAliases`. Only `platform: "opencode-sdk"` may set `llmEngine`; it names
71
+ An LLM engine may set `reasoningEffort` to a non-empty provider-supported
72
+ value such as `"none"`, `"low"`, or `"high"`. AKM sends it as the top-level
73
+ OpenAI-compatible `reasoning_effort` parameter alongside the existing
74
+ `enableThinking` control, because providers do not all honor the same thinking
75
+ switch. `reasoning_effort` is AKM-owned and cannot be set through
76
+ `extraParams`. If a response reports reasoning tokens despite
77
+ `enableThinking: false`, AKM emits a runtime warning so an ineffective provider
78
+ control is visible.
79
+
80
+ An agent engine may set `bin`, `args`, `workspace`, `model`, and `timeoutMs`.
81
+ Only `platform: "opencode-sdk"` may set `llmEngine`; it names
85
82
  the LLM engine used as that SDK engine's fallback connection.
86
83
 
87
84
  `platform: "opencode-sdk"` needs the **`opencode` binary** on PATH (or a `bin`
@@ -90,10 +87,102 @@ client with no dependencies — it spawns `opencode serve` and talks to it — s
90
87
  the npm dependency alone does not make the platform usable. Install the binary
91
88
  with `npm i -g opencode-ai` or opencode's own installer.
92
89
 
93
- Config-root `modelAliases` resolve by exact engine/platform column first, then
94
- the shared `llm` column for direct and fallback LLM engines, then `"*"`. The
95
- resolved exact model is used consistently by direct dispatch, SDK fallback,
96
- health evidence, and frozen workflow plans.
90
+ ### Model-map files
91
+
92
+ AKM ships an immutable `models.json` package asset with three intent aliases:
93
+ `fast`, `balanced`, and `reasoning`. The installed starter has separate
94
+ columns for Claude Code, OpenCode, and OpenCode SDK only. A provider-specific
95
+ identifier is not pretended to work on unrelated engines. Add mappings for
96
+ Gemini, Codex, named direct LLM engines, or other harnesses in your user file.
97
+ Config-root and per-engine `modelAliases` are rejected; this file is the only
98
+ alias definition surface.
99
+
100
+ An optional operator-owned file lives beside `config.json` at
101
+ `$XDG_CONFIG_HOME/akm/models.json` (or `<AKM_CONFIG_DIR>/models.json`). It uses
102
+ the same version-1 schema as the installed file:
103
+
104
+ ```json
105
+ {
106
+ "version": 1,
107
+ "aliases": {
108
+ "fast": {
109
+ "gemini": "gemini-2.5-flash"
110
+ },
111
+ "reasoning": {
112
+ "claude": {
113
+ "inference": {
114
+ "effort": "medium"
115
+ }
116
+ },
117
+ "local-reasoner": {
118
+ "model": "qwen3:30b",
119
+ "inference": {
120
+ "effort": "high"
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+ ```
127
+
128
+ Each engine mapping is either a non-empty exact model string or a structured
129
+ profile with the documented fields `model` and `inference`. A user profile may
130
+ omit `model` when the installed layer already supplies it, as the partial
131
+ Claude override above does. After overlay, every alias/engine entry must have a
132
+ usable model. Unknown profile fields are rejected; JSON-safe fields inside
133
+ `inference` are preserved for engine adapters to lower optimistically.
134
+
135
+ The user file overlays the installed file by alias, engine, and nested object
136
+ field. Objects merge recursively. Arrays, scalars, and explicit `null` replace
137
+ the lower value; omitted fields preserve it. Alias and engine keys are
138
+ case-normalized, and case-colliding definitions are rejected. Unknown model
139
+ inputs still pass through byte-for-byte as exact identifiers. Once a name is a
140
+ known merged alias, selecting an engine with no mapping is an actionable
141
+ configuration error rather than silently sending the alias as a model ID.
142
+
143
+ The common execution cascade reads these files for current direct command and
144
+ non-interactive agent calls, task-v3 runs, and improve/proposal/index
145
+ model work routed through that resolver. A structured alias expands as
146
+ defaults at the layer that selected it; explicit sibling fields and nearer
147
+ layers still win. The resulting request carries the exact model ID and merged
148
+ inference object. Engine lowerers consume that exact selection and never run
149
+ alias resolution again. New workflow starts persist the exact request and
150
+ symbolic runner selection in durable plan v4; resume consumes that frozen
151
+ material without resolving aliases again.
152
+
153
+ Copy the complete installed starter into the user configuration directory when
154
+ you want to customize all fields:
155
+
156
+ ```sh
157
+ akm models copy-defaults
158
+ akm models copy-defaults --overwrite # explicit replacement confirmation
159
+ ```
160
+
161
+ The command validates the installed asset, creates the config directory, and
162
+ writes a fully synced sibling before publication. Without `--overwrite`, a
163
+ hard-link/no-replace operation makes publication atomic: a racing creator wins
164
+ without losing its bytes. A filesystem that cannot provide that operation
165
+ fails safely instead of falling back to a clobbering rename.
166
+
167
+ With `--overwrite`, the portable guarantee is an atomic pathname replacement
168
+ that never follows the target when it is a symlink. AKM verifies the observed
169
+ regular-file identity again immediately before rename, but the portable
170
+ filesystem APIs do not provide a conditional compare-and-swap rename. Another
171
+ process can still change the directory entry after that check; AKM replaces
172
+ the entry at the pathname without dereferencing it. Consequently,
173
+ `overwritten: true` means overwrite was requested for an entry AKM observed,
174
+ not that an inode identity was transactionally locked. Symlinks and other
175
+ non-regular targets observed at either check are refused.
176
+
177
+ AKM does not auto-create or sync this file, and authoritative defaults never
178
+ live in the cache. npm/Node and normal Bun installs read the packaged
179
+ `dist/assets/models.json` lazily, so `akm health` can report a missing or
180
+ malformed package asset as a `model-map-files` failure. A standalone binary has
181
+ the same authoritative bytes embedded at compile time and therefore has no
182
+ external model-map asset that can later disappear; its health check validates
183
+ the embedded copy, and release tests pin copied bytes to `src/assets/models.json`.
184
+ The health check passes when the optional user file is absent and warns with
185
+ its path and JSON location when the user file is unreadable or invalid.
97
186
 
98
187
  `defaults.engine` names an LLM or agent engine. `defaults.llmEngine` must name
99
188
  an LLM engine. There is no first-engine fallback: an unset `defaults.engine`
@@ -157,6 +246,32 @@ incompatible engine never falls back to another engine. Built-in strategies
157
246
  are complete presets. User-defined strategies inherit omitted fields from the
158
247
  built-in `default` strategy before applying their own overrides.
159
248
 
249
+ `processes.triage.judgment` explicitly controls the optional judgment tier.
250
+ Use `true` to enable it, `false` to disable it, or an object with `enabled`,
251
+ `engine`, `model`, `timeoutMs`, and/or `llm` overrides. Existing object values
252
+ such as `{}` and `{ "engine": "reviewer" }` remain enabled by default. Unknown
253
+ object keys are rejected so misspellings cannot silently change execution;
254
+ the retired `mode` and `profile` keys continue to report their engine migration
255
+ guidance. When enabled, engine selection is judgment → triage → strategy →
256
+ `defaults.llmEngine`, and resolution fails closed if none is available.
257
+
258
+ ```jsonc
259
+ {
260
+ "improve": {
261
+ "strategies": {
262
+ "nightly": {
263
+ "processes": {
264
+ "triage": {
265
+ "enabled": true,
266
+ "judgment": { "enabled": true, "engine": "reviewer" }
267
+ }
268
+ }
269
+ }
270
+ }
271
+ }
272
+ }
273
+ ```
274
+
160
275
  The shipped `default` and `frequent` strategies keep improve-stage session
161
276
  extraction off. `proactiveMaintenance` is off in `default` and
162
277
  `reflect-distill`; run `akm improve --strategy proactive-maintenance` to use the
@@ -173,15 +288,12 @@ bundled.
173
288
 
174
289
  ## Indexing
175
290
 
176
- `index.indexBodyOpening` defaults to `false`. When enabled, AKM captures the
177
- first prose paragraph of each Markdown asset body, capped at 280 characters,
178
- into the lowest-weight search content and embedding text. Secret and env files
179
- are never read for this field, and session-kind memories are excluded.
180
-
181
- Changing this option changes indexed text. Run `akm index --full` after
182
- toggling it so all entries and embeddings are rebuilt consistently. If the
183
- setting differs from the state used to build the current index, AKM warns until
184
- that full rebuild completes.
291
+ AKM-native Markdown contributes a normalized body projection to the
292
+ lowest-weight `content` search field. The projection is capped at 16,384
293
+ characters, removes frontmatter, comments, fenced code, and link destinations,
294
+ and is never produced for secret, env, session, or session-checkpoint assets.
295
+ Embedding input is separately capped at 8,192 characters with structured
296
+ metadata placed before body content.
185
297
 
186
298
  ## Semantic search
187
299
 
@@ -190,6 +302,17 @@ embedding-based search. `"auto"` lets AKM set up embeddings (which downloads
190
302
  a local model unless you point `embedding` at a remote provider) and falls
191
303
  back to keyword-only FTS if the embedding runtime is unavailable; `"off"`
192
304
  disables semantic search outright and search is always keyword-only FTS.
305
+ If a backend marked ready cannot serve a query, search still returns the FTS
306
+ results but reports `searchMode: "fts-fallback"` and one sanitized warning.
307
+ This is distinct from `searchMode: "keyword"`, which is the normal result when
308
+ semantic search is disabled or has not been built. A read-only sandbox that
309
+ cannot record best-effort usage telemetry does not by itself mark search as
310
+ degraded.
311
+ The npm/Bun package declares `@huggingface/transformers` as a normal dependency.
312
+ AKM imports that external package directly; it does not carry a copied runtime
313
+ under `src/` or `dist/`. If the dependency is unavailable, reinstall `akm-cli`
314
+ or configure a remote `embedding.endpoint`. Setup does not mutate a global
315
+ installation to add runtime packages.
193
316
  The default is `"off"` so a bare or headless install (`akm bundle create`, `--yes`,
194
317
  `--config`) never silently downloads the local embedding model on first
195
318
  index.
@@ -284,6 +407,10 @@ Each entry is `{ url, name?, enabled?, provider?, options? }`; `provider`
284
407
  defaults to `"static-index"`. See [Registries](https://github.com/itlackey/akm/blob/main/docs/reference/registry.md) for the full
285
408
  field reference and provider list.
286
409
 
410
+ Registry `url` values must not contain username/password userinfo. The built-in
411
+ providers do not currently support authenticated registry requests; `options`
412
+ does not add an authentication mechanism. Use a credential-free HTTPS endpoint.
413
+
287
414
  ## Output defaults
288
415
 
289
416
  `output.format` (one of `json`\|`yaml`\|`text`\|`jsonl`\|`md`\|`html`,
@@ -327,10 +454,6 @@ akm config get engines.fast
327
454
  akm config set engines.fast '{"kind":"llm","endpoint":"http://localhost:11434/v1/chat/completions","model":"qwen3"}'
328
455
  akm config set engines.fast.apiKey '$LOCAL_LLM_API_KEY'
329
456
  akm config unset engines.old
330
- akm migrate status
331
- akm migrate status --config ./prepared-0.9.json
332
- akm migrate apply --config ./prepared-0.9.json --dry-run
333
- akm migrate apply --config ./prepared-0.9.json
334
457
  ```
335
458
 
336
459
  Object values passed to `config set` deep-merge with their current value.
@@ -347,7 +470,7 @@ generic walker.
347
470
  | `AKM_LLM_API_KEY` | Fallback only for the selected `defaults.llmEngine` |
348
471
  | `AKM_EMBED_API_KEY` | Embedding credential |
349
472
  | `AKM_BUNDLE_DIR` | Override the bundle directory |
350
- | `AKM_DATA_DIR` | Override the data directory — durable `index.db`/`workflow.db`/`state.db`, `akm.lock`, config backups (or set `XDG_DATA_HOME`) |
473
+ | `AKM_DATA_DIR` | Override the data directory — `index.db`, durable `state.db`, and `akm.lock` (or set `XDG_DATA_HOME`) |
351
474
  | `AKM_CACHE_DIR` | Override the cache directory — regenerable caches (or set `XDG_CACHE_HOME`) |
352
475
  | `AKM_STATE_DIR` | Override the state directory — task-scheduler invocation state (or set `XDG_STATE_HOME`) |
353
476
  | `AKM_SQLITE_JOURNAL_MODE` | SQLite journal mode: `WAL` (default), `DELETE`, or `TRUNCATE` |
@@ -22,6 +22,24 @@ In every case the receiving endpoint is one you configured or invoked; the data
22
22
 
23
23
  ---
24
24
 
25
+ ## Dry runs and diagnostic output
26
+
27
+ Command dry-run is an intentionally zero-write diagnostic.
28
+ A command dry-run does not mutate or write authored source.
29
+ A command dry-run does not mutate or write durable state.
30
+ A command dry-run records no usage.
31
+ A command dry-run emits no events.
32
+ A command dry-run performs no accounting.
33
+
34
+ `akm command run --dry-run` still reads the selected source and configuration,
35
+ performs authorization, and lowers a request. It does not dispatch or
36
+ materialize credentials. Its output contains only safe field provenance and
37
+ fixed lowering notices; resolved prompt, command, environment, endpoint,
38
+ model, and credential values are excluded. Live `--verbose` writes the same
39
+ safe diagnostic metadata to stderr while preserving normal stdout.
40
+
41
+ ---
42
+
25
43
  ## Local On-Disk Surface
26
44
 
27
45
  AKM writes to these locations on your machine. All paths follow [XDG Base Directory](https://specifications.freedesktop.org/basedir-spec/latest/) conventions on Linux/macOS and Windows conventions on Windows.
@@ -141,7 +159,7 @@ the set of types the code actually emits at HEAD (verified against every
141
159
  | `show` | `akm show <ref>` | `ref`, `type`, `name` |
142
160
  | `select` | `akm show` after a search returning the same ref | `ref`, `entryId` |
143
161
  | `feedback` | `akm feedback <ref>` | `signal` (positive/negative) |
144
- | `sync` | `akm sync` (renamed from `save` in 0.9.0; historical rows keep `save`, and `akm log --type save`/`--type sync` are synonyms on read) | `ref` |
162
+ | `sync` | `akm sync` | `ref` |
145
163
  | `stash_synced` | `akm improve`'s internal auto-sync pass (the `sync.push` feature), **distinct from** the `akm sync` command above | `committed`, `pushed`, `skipped`, `reason`, `attributed` (paths the run wrote and staged), `unattributed` (in-scope paths that went dirty during the run without the run writing them — left for their author) |
146
164
  | `env_access` | `akm env run <name> -- <command>` (audit trail: key **names** only, values never recorded) | `ref`, `keys` |
147
165
  | `secret_access` | `akm secret run <ref> <VAR> -- <command>` (audit trail: var **name** only, value never recorded) | `ref`, `var` |
@@ -18,10 +18,10 @@ one explicitly. 0.9.0 recognizes 11 formats.
18
18
  | `website-snapshot` | Crawled pages tagged `website` (name, description, full body, original crawl URL) | Root `manifest.json` with `url` + `fetchedAt` | Read-only | A website materialized locally via `akm bundle add <url>` |
19
19
  | `agent-skills` | Standalone Agent Skills packages as type `skill` (name, description, tags, body) | A direct child directory containing `SKILL.md` | Read-only | The [github.com/anthropics/skills](https://github.com/anthropics/skills) layout — one `<name>/SKILL.md` per package at the bundle root |
20
20
  | `claude` | `CLAUDE.md` as `instruction`; `commands/`, `agents/`, `skills/<name>/SKILL.md` as their matching types | Root `CLAUDE.md` plus at least one of `commands/`, `agents/`, `skills/` | Read-only | Point AKM at an existing Claude Code `.claude` tool directory |
21
- | `opencode` | Same shape as `claude`, rooted on `AGENTS.md` | `opencode.json`/`opencode.jsonc`, or root `AGENTS.md` plus a tool directory (plural or singular alias) | Read-only | Point AKM at an existing OpenCode `.opencode` tool directory |
21
+ | `opencode` | Same shape as `claude`, rooted on `AGENTS.md` | `opencode.json`/`opencode.jsonc`, or root `AGENTS.md` plus a canonical plural tool directory | Read-only | Point AKM at an existing OpenCode `.opencode` tool directory |
22
22
  | `dotenv` | `env` entries as key names only (never values); `secret` entries as file names only (never content) | Every top-level directory is `env/` and/or `secrets/`, with at least one present | Writable, narrowly — `akm env create`/`env remove`/`secret set` only | A standalone env/secrets-only bundle |
23
- | `akm-workflow` | Workflow steps, name, description, tags | A top-level `.md` file with explicit `type: workflow` frontmatter | Writable — `akm workflow create` only | A standalone workflow bundle, one workflow per file |
24
- | `akm-task` | Tasks as type `task`, name, full raw YAML | A top-level `.yml` file that parses with a non-empty `schedule` key | Read-only | A standalone scheduled-task bundle |
23
+ | `akm-workflow` | Workflow steps, name, description, tags | Either a top-level `.md` file with explicit `type: workflow` frontmatter or a peer top-level GitHub-shaped `.yml` workflow | Writable — `akm workflow create` only | A standalone workflow bundle, one workflow per file |
24
+ | `akm-task` | Strict task-v3 `.yml` sources (`version: 3`) as type `task`, including local schedules/manual triggers and the exact authored YAML | A top-level `.yml` file accepted by the task-v3 source probe (`akm.schedule` or supported `on`) | Read-only | A standalone scheduled-task bundle; `.yaml` is rejected |
25
25
  | `llm-wiki` | `raw/` sources as `wiki-source`; `pages/` as their `pageKind` (default `note`), with resolved cross-reference links | Root `schema.md` plus a `pages/` directory | Read-only (author by writing directly into `pages/`; AKM indexes and serves the result) | [Karpathy's LLM-wiki pattern](https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f) — agent-authored reference wikis |
26
26
  | `akm` (native) | AKM's own 14 native asset types — see [Asset Types](https://github.com/itlackey/akm/blob/main/docs/reference/asset-types.md) | A `.stash` marker directory, or two-plus native subdirectories, or the fallback when nothing else matches | Fully writable — every AKM-native write command | Your working bundle, and any bundle authored as AKM's own format |
27
27
  | `okf` | Frontmatter `type` (defaults to `knowledge`); name, description, tags, links, body | A root `index.md`, or any `.md` file anywhere carrying a non-empty frontmatter `type` | Read-only | The [Open Knowledge Format](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md) — the portable baseline every markdown-based format here is a superset of |
@@ -32,6 +32,25 @@ import`, `proposal accept`, and similar) won't create or edit files in a
32
32
  bundle of that format. Reading, searching, and `akm lint` validation work
33
33
  against every format in the table above regardless of write support.
34
34
 
35
+ For native tool formats such as `claude` and `opencode`, the adapter translates
36
+ recognized native agents and commands into AKM's indexed/runtime representation
37
+ when the bundle is read. AKM does not create a canonical copy, synchronize tool
38
+ directories, or write translated assets back into those native bundles. The
39
+ native files remain authoritative.
40
+
41
+ ## Task format
42
+
43
+ The `akm-task` adapter and native AKM task directory use the same strict
44
+ `version: 3` task-v3 contract. An `akm-task` source is `.yml` only; `.yaml` is
45
+ diagnosed but never indexed, scheduled, or executed. See [Tasks](tasks.md).
46
+
47
+ ## Workflow formats
48
+
49
+ Workflow sources are the one intentional peer-format case inside the native
50
+ AKM workspace: workflows may be `.md` or `.yml`, and both compile to the same
51
+ source IR. Task sources remain `.yml` only and require task v3. See
52
+ [Tasks](tasks.md) and [Workflow Schema](workflow-schema.md).
53
+
35
54
  ## Why this matters
36
55
 
37
56
  This table is the proof of the first pillar: **one library for every agent**.
@@ -46,5 +65,6 @@ formats are writable today and why.
46
65
 
47
66
  - [Asset Types](https://github.com/itlackey/akm/blob/main/docs/reference/asset-types.md) — the 14 native asset types AKM's own format recognizes
48
67
  - [Adapters](https://github.com/itlackey/akm/blob/main/docs/architecture/adapters.md) — how AKM picks a format, the write-path internals, and current caveats
68
+ - [Agent, Command, Engine, and Model Resolution](https://github.com/itlackey/akm/blob/main/docs/architecture/specs/agent-command-engine-model-design.md) — approved runtime semantics for translated native agents and commands
49
69
  - [Concepts](https://github.com/itlackey/akm/blob/main/docs/guides/concepts.md) — the retrieval loop these formats feed
50
70
  - [Wikis](https://github.com/itlackey/akm/blob/main/docs/guides/wikis.md) — the `llm-wiki` authoring workflow
@@ -0,0 +1,182 @@
1
+ # Tasks
2
+
3
+ Task assets are strict, local automation sources. They live at
4
+ `<bundle>/tasks/<id>.yml`, use task schema `version: 3`, and can be run directly
5
+ or reconciled to cron, launchd, or Windows Task Scheduler with `akm task sync`.
6
+ The task file is authored source; scheduler entries are derived OS state.
7
+
8
+ ## Files and schema
9
+
10
+ The only recognized task extension is `.yml`. A `.yaml` near miss is never
11
+ indexed, scheduled, or run. Every task must declare `version: 3`; unknown keys
12
+ and older versions fail closed. The published [task schema](../../schemas/akm-task.json)
13
+ describes the hand-authored contract, while `src/tasks/source-v3.ts` remains the
14
+ authoritative bounded parser.
15
+
16
+ At the top level a task can use `name`, exactly one executable selector, common
17
+ step fields, and exactly one trigger source:
18
+
19
+ ```yaml
20
+ version: 3
21
+ name: Nightly review
22
+ uses: workflows/nightly-review
23
+ with:
24
+ strict: true
25
+ akm:
26
+ schedule: "0 4 * * *"
27
+ enabled: true
28
+ timeout: 30m
29
+ ```
30
+
31
+ Task YAML is bounded before expansion: source size, YAML depth, aggregate node
32
+ count, mapping width, string size, and collection sizes all have finite limits.
33
+ Aliases, merge keys, custom tags, duplicate keys, accessors, and non-plain data
34
+ are rejected rather than normalized.
35
+
36
+ ## Executable targets: `uses` or `run`
37
+
38
+ A task selects exactly one of `uses` or `run`; the two fields are mutually
39
+ exclusive.
40
+
41
+ `uses` accepts these 0.9.2 target shapes:
42
+
43
+ - `akm/command`, the built-in inline/referenced command action. Its `with`
44
+ object requires exactly one of `with.ref` or `with.content`; they are
45
+ mutually exclusive. `with.arguments` is one optional portable string, used
46
+ for the single, one-pass `$ARGUMENTS` substitution.
47
+ - Asset refs rooted at `commands/`, `workflows/`, or `scripts/`, optionally
48
+ qualified with a bundle such as `team//commands/review`.
49
+ - A revision-qualified GitHub action spelling such as `owner/repo@ref` or
50
+ `owner/repo/path@revision`. That syntax is recognized so it cannot be
51
+ mistaken for an AKM ref, but remote action acquisition and execution are
52
+ unsupported in 0.9.2 and fail before dispatch.
53
+
54
+ Agent refs such as `agents/reviewer` are personas and are not executable.
55
+ Task refs such as `tasks/nightly` are also not executable. Local actions
56
+ (`./action`) are rejected and Docker actions (`docker://image`) are unsupported.
57
+ GitHub expressions are unsupported and rejected before dispatch. Unqualified
58
+ remote actions are rejected too.
59
+
60
+ The runtime applies this target-by-target field matrix. Validation is strict;
61
+ fields are not silently discarded.
62
+ For `scripts/` asset refs, `with` is rejected before dispatch.
63
+
64
+ | Target | `with` | task `env` | Interpreter / execution |
65
+ |---|---|---|---|
66
+ | `run` | Rejected; `with` is legal only with `uses` | Allowed | One authored string through the selected closed host `shell` |
67
+ | `akm/command` | Required action object: exactly one of `ref` or `content`, plus optional portable `arguments` | Allowed and passed through the command resolver | Shared command authorization and lowering |
68
+ | `commands/<name>` | Direct command refs: `with` is rejected; use `akm/command` for portable arguments | Allowed and passed through the command resolver | Shared command authorization and lowering |
69
+ | `workflows/<name>` | Of asset refs, workflow refs alone consume `with` as workflow params | A nonempty task `env` is rejected because the durable workflow runtime cannot consume it in 0.9.2 | Fresh durable workflow start |
70
+ | `scripts/<name>.<ext>` | Script refs: `with` is rejected | Allowed for the child process | Closed extension-to-interpreter table below |
71
+ | `owner/repo[/path]@ref` | Not consumed | Not consumed | Recognized spelling, but remote acquisition is rejected in 0.9.2 |
72
+
73
+ Script refs use this closed table; any other extension fails before dispatch:
74
+
75
+ | Extensions | Interpreter |
76
+ |---|---|
77
+ | `.sh` | `sh` |
78
+ | `.ts`, `.js` | Bun; JavaScript and TypeScript script targets require Bun (the standalone binary uses its embedded Bun runtime) |
79
+ | `.ps1` | `powershell -NoProfile -NonInteractive -File` |
80
+ | `.cmd`, `.bat` | `cmd /d /s /c` |
81
+ | `.py` | `python` |
82
+ | `.rb` | `ruby` |
83
+ | `.go` | `go run` |
84
+ | `.pl` | `perl` |
85
+ | `.php` | `php` |
86
+ | `.lua` | `lua` |
87
+ | `.r` | `rscript` |
88
+ | `.swift` | `swift` |
89
+ | `.kt`, `.kts` | Kotlin (`kotlin` for `.kt`, `kotlinc -script` for `.kts`) |
90
+
91
+ `run` is one non-empty shell string. It may specify `shell` from the closed host
92
+ shell table `bash`, `sh`, `zsh`, `pwsh`, `powershell`, or `cmd`. Shell expansion
93
+ is runtime behavior for an explicitly authored task `run`; AKM does not infer a
94
+ shell from `uses`. `working-directory` must be a relative, contained path under
95
+ the task's workspace root. Absolute paths, traversal, dangling links, and
96
+ symlink escapes fail before execution.
97
+
98
+ Common resolver fields live under `akm`: `agent`, `engine`, `model`,
99
+ `inference`, `outputSchema`, `tools`, `timeout`, `redact`, `maxSteps`, and
100
+ `maxRetries`. Environment entries are literal string, number, or boolean
101
+ values. Keep credentials out of task source; `redact` contains environment
102
+ variable names, never secret values.
103
+
104
+ ## Scheduling and triggers
105
+
106
+ A task has exactly one scheduling source: either `akm.schedule` or top-level
107
+ `on`. The two sources are mutually exclusive.
108
+
109
+ The compact AKM spelling is:
110
+
111
+ ```yaml
112
+ version: 3
113
+ run: akm improve --strategy default
114
+ akm:
115
+ schedule: "@daily"
116
+ enabled: false
117
+ ```
118
+
119
+ The GitHub-shaped local trigger subset accepts schedule entries and an empty
120
+ manual trigger:
121
+
122
+ ```yaml
123
+ version: 3
124
+ uses: commands/review
125
+ on:
126
+ schedule:
127
+ - cron: "0 6 * * *"
128
+ workflow_dispatch: {}
129
+ ```
130
+
131
+ `workflow_dispatch` accepts no inputs. Service events such as `push` are
132
+ rejected and create no watcher or polling daemon. A source with only
133
+ `workflow_dispatch` is manual-only and is not installed as a time schedule.
134
+ Multiple schedule entries create deterministic scheduler bindings for the one
135
+ source task.
136
+
137
+ `akm task run <id>` executes a task immediately, including a disabled task.
138
+ `akm task sync` validates the complete desired set before atomically
139
+ reconciling scheduler state. Scheduled invocations re-read the guarded current
140
+ task bytes; workflow targets then create a fresh durable workflow freeze.
141
+
142
+ ## Migrating task v2 to v3
143
+
144
+ Normal execution rejects task v2 and prints the migration hint. Preview the
145
+ same fail-closed migration plan that apply consumes:
146
+
147
+ ```sh
148
+ akm migrate apply --dry-run
149
+ akm migrate apply
150
+ ```
151
+
152
+ The planner reports every input file as `changed`, `skipped`, or `blocked`.
153
+ Deterministic prompt, command-ref, workflow-ref, and safe command-string cases
154
+ become v3. An argv array or any command whose shell meaning cannot be preserved
155
+ is blocked for manual review and remains untouched. Apply validates a complete
156
+ v3 replacement before writing and backs up each original immediately before
157
+ replacement.
158
+
159
+ See the [0.9.1 to 0.9.2 migration guide](../migration/v0.9.1-to-v0.9.2.md)
160
+ for before/after examples, preserved fields, and recovery guidance.
161
+
162
+ ## Operations
163
+
164
+ - `akm search --type task` and `akm show tasks/<id>` inspect task assets.
165
+ - `akm task add` writes a task-v3 source and installs it after validation.
166
+ - `akm task history` reads durable run history from `state.db`.
167
+ - Set `akm.enabled: false` and sync to disable a binding.
168
+ - Delete the `.yml` source and sync to remove its derived binding.
169
+ - Use `akm task sync --rebind` only when deliberately changing the captured
170
+ AKM runtime, then verify with `akm task doctor`.
171
+
172
+ Scheduler execution is at least once. Backends provide a stable invocation
173
+ identity and AKM fences stale attempts, but an ambiguous process crash can be
174
+ observed only after the external work has started. Make scheduled side effects
175
+ idempotent where possible.
176
+
177
+ ## See also
178
+
179
+ - [CLI Reference: task](cli.md#task)
180
+ - [Scheduling guide](https://github.com/itlackey/akm/blob/main/docs/guides/scheduling.md)
181
+ - [Workflow source formats](workflow-schema.md)
182
+ - [Data and telemetry](data-and-telemetry.md)