akm-cli 0.9.30 → 0.10.26101001-alpha

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 (353) hide show
  1. package/CHANGELOG.md +282 -0
  2. package/README.md +10 -10
  3. package/ROADMAP.md +112 -0
  4. package/STABILITY.md +79 -53
  5. package/dist/api-node.mjs +20 -0
  6. package/dist/api.d.ts +23 -0
  7. package/dist/api.js +45 -0
  8. package/dist/assets/hints/cli-hints-full.md +13 -27
  9. package/dist/assets/hints/cli-hints-short.md +1 -1
  10. package/dist/assets/improve-strategies/default.json +3 -3
  11. package/dist/assets/prompts/consolidate-pair.md +9 -7
  12. package/dist/cli/shared.js +31 -48
  13. package/dist/cli/unknown-flags.js +6 -43
  14. package/dist/cli.js +8 -34
  15. package/dist/commands/agent/contribute-cli.js +1 -1
  16. package/dist/commands/completions.js +1 -2
  17. package/dist/commands/config-cli.js +5 -28
  18. package/dist/commands/env/env-cli.js +5 -5
  19. package/dist/commands/env/secret-cli.js +2 -2
  20. package/dist/commands/health/checks.js +41 -16
  21. package/dist/commands/health/plugin-staleness.js +52 -22
  22. package/dist/commands/improve/autonomy-gate.js +5 -3
  23. package/dist/commands/improve/consolidate/pair-pass.js +7 -1
  24. package/dist/commands/improve/consolidate.js +6 -35
  25. package/dist/commands/improve/distill/lesson-update.js +91 -0
  26. package/dist/commands/improve/distill-guards.js +1 -43
  27. package/dist/commands/improve/distill.js +140 -20
  28. package/dist/commands/improve/extract-cli.js +1 -1
  29. package/dist/commands/improve/improve-cli.js +120 -114
  30. package/dist/commands/improve/improve-strategies.js +8 -12
  31. package/dist/commands/improve/loop-stages.js +0 -1
  32. package/dist/commands/improve/planner.js +0 -1
  33. package/dist/commands/improve/preparation.js +40 -99
  34. package/dist/commands/improve/proactive-maintenance.js +2 -2
  35. package/dist/commands/improve/reflect-noise.js +3 -55
  36. package/dist/commands/improve/reflect.js +3 -8
  37. package/dist/commands/improve/retrieval-scope.js +2 -2
  38. package/dist/commands/improve/salience.js +2 -9
  39. package/dist/commands/improve/stage.js +14 -9
  40. package/dist/commands/lint/index.js +5 -20
  41. package/dist/commands/observability-cli.js +3 -9
  42. package/dist/commands/proposal/drain.js +39 -6
  43. package/dist/commands/proposal/proposal-cli.js +10 -30
  44. package/dist/commands/proposal/repository.js +3 -3
  45. package/dist/commands/read/knowledge.js +3 -3
  46. package/dist/commands/read/remember-cli.js +0 -13
  47. package/dist/commands/read/search-cli.js +29 -97
  48. package/dist/commands/read/search.js +0 -11
  49. package/dist/commands/read/show.js +0 -19
  50. package/dist/commands/sources/plugin-upgrade.js +164 -101
  51. package/dist/commands/sources/sources-cli.js +1 -15
  52. package/dist/commands/sources/stash-cli.js +4 -12
  53. package/dist/commands/tasks/tasks-cli.js +4 -115
  54. package/dist/commands/workflow/plan.js +11 -33
  55. package/dist/commands/workflow-cli.js +2 -7
  56. package/dist/core/adapter/adapter-ids.js +1 -2
  57. package/dist/core/adapter/adapters/agent-skills-adapter.js +0 -4
  58. package/dist/core/adapter/adapters/akm-adapter.js +9 -48
  59. package/dist/core/adapter/adapters/akm-lint.js +10 -26
  60. package/dist/core/adapter/adapters/akm-metadata.js +2 -72
  61. package/dist/core/adapter/adapters/akm-task-adapter.js +0 -5
  62. package/dist/core/adapter/adapters/akm-workflow-adapter.js +9 -28
  63. package/dist/core/adapter/adapters/dotenv-adapter.js +1 -20
  64. package/dist/core/adapter/adapters/generic-files-adapter.js +0 -10
  65. package/dist/core/adapter/adapters/llm-wiki-adapter.js +0 -4
  66. package/dist/core/adapter/adapters/tool-dir-shared.js +0 -24
  67. package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -4
  68. package/dist/core/adapter/recognize-match.js +3 -4
  69. package/dist/core/common.js +18 -2
  70. package/dist/core/config/config-schema.js +12 -15
  71. package/dist/core/config/config-types.js +6 -15
  72. package/dist/core/config/config-walker.js +6 -23
  73. package/dist/core/config/config.js +17 -80
  74. package/dist/core/config/engine-semantics.js +7 -3
  75. package/dist/core/config/schema/engines.js +7 -7
  76. package/dist/core/config/schema/improve-processes.js +8 -61
  77. package/dist/core/config/schema/improve.js +2 -21
  78. package/dist/core/config/schema/index-config.js +6 -39
  79. package/dist/core/env-secret-ref.js +2 -45
  80. package/dist/core/errors.js +1 -2
  81. package/dist/core/extra-params.js +2 -86
  82. package/dist/core/file-lock.js +10 -1
  83. package/dist/core/improve-result.js +11 -1
  84. package/dist/core/mutation-target.js +2 -2
  85. package/dist/core/recognition-util.js +4 -5
  86. package/dist/core/warn.js +21 -4
  87. package/dist/core/write-source.js +3 -3
  88. package/dist/execution/target-ref.js +1 -2
  89. package/dist/indexer/search/db-search.js +4 -19
  90. package/dist/indexer/search/fts-query.js +0 -19
  91. package/dist/integrations/agent/engine-resolution.js +5 -2
  92. package/dist/integrations/agent/index.js +1 -1
  93. package/dist/integrations/agent/profiles.js +41 -98
  94. package/dist/integrations/agent/request-lowering.js +3 -3
  95. package/dist/integrations/harnesses/aider/index.js +5 -0
  96. package/dist/integrations/harnesses/amazonq/index.js +1 -0
  97. package/dist/integrations/harnesses/claude/config-import.js +2 -3
  98. package/dist/integrations/harnesses/claude/index.js +5 -0
  99. package/dist/integrations/harnesses/codex/index.js +1 -0
  100. package/dist/integrations/harnesses/copilot/index.js +1 -0
  101. package/dist/integrations/harnesses/gemini/index.js +1 -0
  102. package/dist/integrations/harnesses/index.js +18 -39
  103. package/dist/integrations/harnesses/opencode/agent-builder.js +60 -35
  104. package/dist/integrations/harnesses/opencode/config-import.js +121 -52
  105. package/dist/integrations/harnesses/opencode/index.js +22 -0
  106. package/dist/integrations/harnesses/opencode/plugin-layout.js +68 -0
  107. package/dist/integrations/harnesses/opencode/session-log-types.js +12 -0
  108. package/dist/integrations/harnesses/opencode/session-log-v1.js +72 -0
  109. package/dist/integrations/harnesses/opencode/session-log-v2.js +140 -0
  110. package/dist/integrations/harnesses/opencode/session-log.js +104 -115
  111. package/dist/integrations/harnesses/opencode/version.js +98 -0
  112. package/dist/integrations/harnesses/opencode-sdk/{harness.js → index.js} +5 -17
  113. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +105 -206
  114. package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +199 -0
  115. package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +228 -0
  116. package/dist/integrations/harnesses/opencode-sdk/wire.js +66 -0
  117. package/dist/integrations/harnesses/openhands/index.js +1 -0
  118. package/dist/integrations/harnesses/pi/index.js +1 -0
  119. package/dist/integrations/harnesses/shared.js +2 -0
  120. package/dist/integrations/harnesses/types.js +2 -0
  121. package/dist/llm/client.js +74 -14
  122. package/dist/output/cli-hints.js +1 -1
  123. package/dist/output/context.js +10 -19
  124. package/dist/output/format-exempt.js +5 -8
  125. package/dist/output/shapes/helpers.js +1 -22
  126. package/dist/output/shapes/passthrough.js +0 -1
  127. package/dist/output/shapes.js +3 -31
  128. package/dist/output/stdout.js +5 -1
  129. package/dist/output/text/command-format.js +6 -1
  130. package/dist/output/text/workflow-format.js +4 -22
  131. package/dist/scripts/akm-migrate-node.js +15746 -16706
  132. package/dist/scripts/akm-migrate.js +16319 -17275
  133. package/dist/setup/detect.js +10 -4
  134. package/dist/setup/harness-config-import.js +5 -14
  135. package/dist/setup/setup.js +1 -1
  136. package/dist/setup/steps/tasks.js +12 -13
  137. package/dist/storage/repositories/task-history-repository.js +0 -5
  138. package/dist/storage/repositories/workflow-runs-repository.js +5 -15
  139. package/dist/tasks/embedded.js +2 -1
  140. package/dist/tasks/run/task-history.js +0 -2
  141. package/dist/tasks/schedule-gates.js +39 -0
  142. package/dist/tasks/scheduler-binding.js +0 -16
  143. package/dist/tasks/scheduler-sync.js +3 -97
  144. package/dist/tasks/source/bounded-document.js +1 -1
  145. package/dist/tasks/source/task-source-v4.js +2 -12
  146. package/dist/tasks/task-run-reserved-flags.js +2 -31
  147. package/dist/workflows/authoring/authoring.js +6 -6
  148. package/dist/workflows/compile.js +8 -65
  149. package/dist/workflows/exec/child-workflow.js +22 -3
  150. package/dist/workflows/exec/native-executor.js +12 -147
  151. package/dist/workflows/exec/run-workflow.js +31 -103
  152. package/dist/workflows/exec/step-work.js +9 -178
  153. package/dist/workflows/exec/unit-dispatch.js +0 -10
  154. package/dist/workflows/freeze/environment.js +3 -44
  155. package/dist/workflows/freeze/freeze.js +8 -41
  156. package/dist/workflows/freeze/targets/child-workflow.js +27 -63
  157. package/dist/workflows/freeze/targets/command.js +2 -16
  158. package/dist/workflows/freeze/targets/shell.js +0 -2
  159. package/dist/workflows/freeze/task-bindings.js +2 -28
  160. package/dist/workflows/ir/params.js +12 -2
  161. package/dist/workflows/parser.js +82 -232
  162. package/dist/workflows/plan.js +1 -1
  163. package/dist/workflows/renderer.js +10 -19
  164. package/dist/workflows/runtime/run-plan.js +11 -53
  165. package/dist/workflows/runtime/runs.js +4 -27
  166. package/dist/workflows/source-files.js +12 -16
  167. package/dist/workflows/source-semantics.js +1 -93
  168. package/docs/README.md +43 -42
  169. package/docs/agents/README.md +15 -0
  170. package/docs/agents/agent-install.md +14 -0
  171. package/docs/architecture/README.md +67 -0
  172. package/docs/architecture/adapters.md +258 -0
  173. package/docs/architecture/akm-architecture-decision-history.md +2055 -0
  174. package/docs/architecture/akm-core-principles.md +126 -0
  175. package/docs/architecture/architecture.md +578 -0
  176. package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +550 -0
  177. package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +72 -0
  178. package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +142 -0
  179. package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +189 -0
  180. package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +97 -0
  181. package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +108 -0
  182. package/docs/architecture/decisions/0006-task-source-version-routing.md +124 -0
  183. package/docs/architecture/decisions/0007-workflow-composition-bounds.md +83 -0
  184. package/docs/architecture/decisions/0008-task-binding-normalization.md +88 -0
  185. package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +80 -0
  186. package/docs/architecture/decisions/0010-driver-protocol-cut.md +36 -0
  187. package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +125 -0
  188. package/docs/architecture/decisions/README.md +62 -0
  189. package/docs/architecture/improvement.md +471 -0
  190. package/docs/architecture/internals/classification.md +154 -0
  191. package/docs/architecture/internals/fresh-host-rebuild-runbook.md +40 -0
  192. package/docs/architecture/internals/functional-contract-patterns.md +340 -0
  193. package/docs/architecture/internals/health-advisories.md +110 -0
  194. package/docs/architecture/internals/improve-workflow.md +720 -0
  195. package/docs/architecture/internals/indexing.md +498 -0
  196. package/docs/architecture/internals/registry-network-boundary.md +57 -0
  197. package/docs/architecture/internals/search.md +248 -0
  198. package/docs/architecture/internals/storage-locations.md +943 -0
  199. package/docs/architecture/persisted-data-compat.md +68 -0
  200. package/docs/architecture/reviews/env-secret-access.md +319 -0
  201. package/docs/architecture/runtime-boundary-design.md +153 -0
  202. package/docs/architecture/specs/0.9.0-close-out-plan.md +361 -0
  203. package/docs/architecture/specs/0.9.0-decisions.md +532 -0
  204. package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +745 -0
  205. package/docs/architecture/specs/0.9.0-open-items-register.md +135 -0
  206. package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +740 -0
  207. package/docs/architecture/specs/0.9.0-release-surface-review.md +636 -0
  208. package/docs/architecture/specs/agent-command-engine-model-design.md +513 -0
  209. package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +501 -0
  210. package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +291 -0
  211. package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +2059 -0
  212. package/docs/architecture/specs/di-seams-plan.md +539 -0
  213. package/docs/architecture/specs/driver-protocol-keep-or-cut.md +275 -0
  214. package/docs/architecture/specs/fact-asset-type.md +142 -0
  215. package/docs/architecture/specs/improve-collapse-churn-detector-design.md +634 -0
  216. package/docs/architecture/specs/okf-support.md +148 -0
  217. package/docs/architecture/specs/ref.md +329 -0
  218. package/docs/architecture/specs/reviews/task-workflow-unification/README.md +72 -0
  219. package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +152 -0
  220. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +352 -0
  221. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +300 -0
  222. package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +402 -0
  223. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +758 -0
  224. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +645 -0
  225. package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +602 -0
  226. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +27 -0
  227. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +27 -0
  228. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +74 -0
  229. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +15 -0
  230. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +132 -0
  231. package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +147 -0
  232. package/docs/architecture/specs/stash-conventions-code-spec.md +275 -0
  233. package/docs/architecture/specs/stash-organization-conventions.md +377 -0
  234. package/docs/architecture/specs/task-workflow-format-unification.md +721 -0
  235. package/docs/architecture/specs/workflow-engine-buy-vs-build.md +231 -0
  236. package/docs/architecture/specs/workflow-format-unification.md +432 -0
  237. package/docs/architecture/testing/manual-testing-checklist.md +3411 -0
  238. package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +924 -0
  239. package/docs/architecture/testing/task-workflow-manual-tests.md +1720 -0
  240. package/docs/architecture/testing/testing-workflow.md +446 -0
  241. package/docs/architecture/workflow-engine.md +223 -0
  242. package/docs/guides/README.md +33 -0
  243. package/docs/guides/author-bundles.md +310 -0
  244. package/docs/guides/author-workflows.md +490 -0
  245. package/docs/guides/bundles.md +321 -0
  246. package/docs/guides/capture-knowledge.md +136 -0
  247. package/docs/guides/claude-code-vs-akm-workflows.md +29 -0
  248. package/docs/guides/concepts.md +93 -0
  249. package/docs/guides/discover-and-load.md +158 -0
  250. package/docs/guides/getting-started.md +240 -0
  251. package/docs/guides/improve-the-library.md +246 -0
  252. package/docs/guides/knowledge-management.md +18 -0
  253. package/docs/guides/recipes/headless-install.md +97 -0
  254. package/docs/guides/recipes/website-source.md +28 -0
  255. package/docs/guides/run-workflows.md +279 -0
  256. package/docs/guides/scheduling.md +123 -0
  257. package/docs/guides/use-with-any-agent.md +174 -0
  258. package/docs/guides/wikis.md +81 -0
  259. package/docs/integration/bundling-akm.md +7 -6
  260. package/docs/maintainers/README.md +19 -0
  261. package/docs/maintainers/curate-workmap.md +335 -0
  262. package/docs/maintainers/eval.md +3 -0
  263. package/docs/maintainers/local-development.md +108 -0
  264. package/docs/maintainers/release-checklist.md +132 -0
  265. package/docs/migration/README.md +2 -2
  266. package/docs/migration/release-notes/0.0.13.md +1 -1
  267. package/docs/migration/release-notes/0.1.0.md +1 -1
  268. package/docs/migration/release-notes/0.2.0.md +1 -1
  269. package/docs/migration/release-notes/0.3.0.md +1 -1
  270. package/docs/migration/release-notes/0.5.0.md +1 -1
  271. package/docs/migration/release-notes/0.6.0.md +1 -1
  272. package/docs/migration/release-notes/0.7.0.md +1 -1
  273. package/docs/migration/release-notes/0.7.3.md +2 -2
  274. package/docs/migration/release-notes/0.7.4.md +1 -1
  275. package/docs/migration/release-notes/0.7.5.md +1 -1
  276. package/docs/migration/release-notes/0.8.0.md +1 -1
  277. package/docs/migration/release-notes/0.9.0.md +1 -1
  278. package/docs/migration/release-notes/0.9.14.md +1 -1
  279. package/docs/migration/release-notes/0.9.15.md +1 -1
  280. package/docs/migration/release-notes/0.9.16.md +1 -1
  281. package/docs/migration/release-notes/0.9.17.md +1 -1
  282. package/docs/migration/release-notes/0.9.19.md +1 -1
  283. package/docs/migration/release-notes/0.9.2.md +1 -1
  284. package/docs/migration/release-notes/README.md +27 -31
  285. package/docs/migration/v0.5-to-v0.6.md +759 -0
  286. package/docs/migration/v0.8-to-v0.9.md +1 -1
  287. package/docs/plans/0.9.2-agent-command-workflow-plan.md +423 -0
  288. package/docs/posts/README.md +30 -0
  289. package/docs/posts/akm-command-tour.md +495 -0
  290. package/docs/posts/akm-logo-sized.webp +0 -0
  291. package/docs/posts/belief-aware-memory-12.md +139 -0
  292. package/docs/posts/config-v2-lessons-16.md +191 -0
  293. package/docs/posts/improve-loop-autonomous-10.md +225 -0
  294. package/docs/posts/improve-pipeline-debugging-0803.md +179 -0
  295. package/docs/posts/intro-part-01.md +76 -0
  296. package/docs/posts/intro-part-02.md +221 -0
  297. package/docs/posts/intro-part-03.md +190 -0
  298. package/docs/posts/intro-part-04.md +221 -0
  299. package/docs/posts/llm-mode-reflect-13.md +166 -0
  300. package/docs/posts/openpalm-built-on-akm.md +86 -0
  301. package/docs/posts/progressive-disclosure-06.md +129 -0
  302. package/docs/posts/proposal-safety-net-15.md +112 -0
  303. package/docs/posts/release-0.5.0.md +247 -0
  304. package/docs/posts/release-0.6.0.md +117 -0
  305. package/docs/posts/release-0.7.0.md +159 -0
  306. package/docs/posts/release-0.8.0.md +332 -0
  307. package/docs/posts/scattered-skills-05.md +100 -0
  308. package/docs/posts/task-assets-persistent-workflows-11.md +222 -0
  309. package/docs/posts/team-skills-07.md +198 -0
  310. package/docs/posts/wiki-agent-knowledge-08.md +223 -0
  311. package/docs/posts/workflows-vaults-09.md +321 -0
  312. package/docs/product-surface.md +54 -0
  313. package/docs/reference/README.md +2 -2
  314. package/docs/reference/api.md +65 -0
  315. package/docs/reference/asset-types.md +166 -0
  316. package/docs/reference/bundle-types.md +2 -4
  317. package/docs/reference/cli.md +129 -175
  318. package/docs/reference/configuration.md +84 -19
  319. package/docs/reference/data-and-telemetry.md +1 -1
  320. package/docs/reference/env-and-secrets.md +126 -0
  321. package/docs/reference/memory.md +124 -0
  322. package/docs/reference/refs.md +156 -0
  323. package/docs/reference/registry.md +489 -0
  324. package/docs/reference/supported-formats.md +3 -4
  325. package/docs/reference/tasks.md +12 -19
  326. package/docs/reference/website-sources.md +141 -0
  327. package/docs/reference/workflow-schema.md +89 -317
  328. package/docs/reference/workflows.md +20 -48
  329. package/package.json +23 -16
  330. package/schemas/akm-config.json +2 -243
  331. package/schemas/akm-task.json +2 -3
  332. package/schemas/akm-workflow.json +47 -84
  333. package/dist/assets/improve-strategies/catchup.json +0 -41
  334. package/dist/assets/improve-strategies/proactive-maintenance.json +0 -24
  335. package/dist/assets/improve-strategies/quick.json +0 -17
  336. package/dist/assets/improve-strategies/reflect-distill.json +0 -29
  337. package/dist/assets/improve-strategies/thorough.json +0 -49
  338. package/dist/assets/tasks/improve/akm-improve-catchup.yml +0 -6
  339. package/dist/assets/tasks/improve/akm-improve-frequent.yml +0 -4
  340. package/dist/assets/tasks/improve/akm-improve-nightly.yml +0 -4
  341. package/dist/cli/retired-commands.js +0 -118
  342. package/dist/commands/tasks/validate.js +0 -176
  343. package/dist/core/config/legacy-source-shape-shim.js +0 -117
  344. package/dist/integrations/harnesses/ids.js +0 -28
  345. package/dist/tasks/source/task-source-v3-frozen.js +0 -424
  346. package/dist/tasks/source/task-to-v4.js +0 -863
  347. package/dist/workflows/exec/worktree.js +0 -372
  348. package/dist/workflows/freeze/child-output-references.js +0 -83
  349. package/dist/workflows/freeze/identity.js +0 -22
  350. package/dist/workflows/freeze/targets/script.js +0 -50
  351. package/dist/workflows/freeze/targets/task.js +0 -124
  352. package/dist/workflows/github-yaml.js +0 -506
  353. package/dist/workflows/runtime/run-outputs.js +0 -80
@@ -0,0 +1,490 @@
1
+ # Author's Guide: Writing Workflows
2
+
3
+ This guide walks through writing and testing a workflow definition: choosing a
4
+ source format, the Markdown structure, a minimal complete example, common authoring mistakes,
5
+ and how to verify gates and outputs before you publish. It assumes you
6
+ already know what a workflow is; for the exhaustive, exact-syntax reference
7
+ — every frontmatter key, the reference grammar, gates, and outputs — see
8
+ [Workflow Schema](../reference/workflow-schema.md). For operating a run once
9
+ it's written, see [Running Workflows](../guides/run-workflows.md).
10
+
11
+ ## Start from the template
12
+
13
+ A workflow is a Markdown file: OKF-conformant frontmatter carries the
14
+ orchestration graph and the body carries instructions and gate rubrics.
15
+
16
+ Use `akm workflow create --print` to print a valid starter, then edit it and
17
+ register it with `akm workflow create`. Validate with `akm lint`:
18
+
19
+ ```sh
20
+ akm workflow create my-release --print # Print the template, without writing
21
+ akm workflow create my-release --from ./my-release.md
22
+ akm lint --type workflows # Check for structural errors before using it
23
+ ```
24
+
25
+ Both formats compile to source IR version 1. Choose Markdown for maps, routes,
26
+ gates, typed artifacts, and prose-rich agent instructions. Choose the bounded
27
+ YAML subset for a single local self-hosted job made of token-safe `run` and
28
+ supported local `uses` steps.
29
+
30
+ ## A minimal complete example
31
+
32
+ ```markdown
33
+ ---
34
+ type: workflow
35
+ description: Ship a tagged release to production
36
+ params:
37
+ version: { type: string, description: The semver version string to release }
38
+ steps:
39
+ - id: validate
40
+ - id: build
41
+ inputs: [steps.validate.output]
42
+ ---
43
+
44
+ # Ship Release
45
+
46
+ ## validate
47
+
48
+ Check that the `version` parameter follows semver and the tag does not
49
+ already exist.
50
+
51
+ ### gate
52
+
53
+ - `git tag v<version>` does not already exist.
54
+ - The version string matches `^\d+\.\d+\.\d+$`.
55
+
56
+ ## build
57
+
58
+ Run `npm run build && npm test`, using the validation from `validate`,
59
+ attached to this unit as input. Fix any failures before proceeding.
60
+ ```
61
+
62
+ Walking through it: `validate` and `build` are both bare unit steps — neither
63
+ declares `unit:`, `map:`, or `route:`, so each is "still a unit step," the
64
+ minimal declaration. `build` names `steps.validate.output` in `inputs:`, so
65
+ the engine attaches `validate`'s result to `build`'s dispatched context, and
66
+ `build`'s own re-dispatch on a resumed run is keyed to that exact slice — not
67
+ the whole run. `validate` has a `### gate`; `build` does not, so `build`
68
+ completes as soon as its unit succeeds, with no verification pass.
69
+
70
+ For a richer example — fan-out with `map`, `route`-based branching, retries,
71
+ and a run `budget` — see
72
+ [Workflow Schema: Richer example](../reference/workflow-schema.md#richer-example).
73
+
74
+ ## Deterministic steps: run a command, gate on it
75
+
76
+ Not every step needs a model. Running the test suite, building, linting, or
77
+ invoking a script is *deterministic work*: there is exactly one right answer and
78
+ the command already knows it. A step whose `unit:` declares `exec:` runs that
79
+ command directly — no LLM, no agent, no tokens, no nondeterminism.
80
+
81
+ The canonical shape is a **test step that gates the rest of the run**:
82
+
83
+ ```markdown
84
+ ---
85
+ type: workflow
86
+ description: Fix a failing test, then verify the suite is green
87
+ params:
88
+ failure: { type: string, description: The failing test name or error }
89
+ steps:
90
+ - id: fix
91
+ - id: test
92
+ inputs: [steps.fix.output]
93
+ unit:
94
+ exec:
95
+ command: ["bun", "run", "test:unit"]
96
+ timeout: "10m"
97
+ retry: { max: 1, on: [timeout] }
98
+ - id: report
99
+ inputs: [steps.test.output]
100
+ ---
101
+
102
+ # Fix and Verify
103
+
104
+ ## fix
105
+
106
+ Find the cause of the failure described in the run parameters and fix it.
107
+ Explain what you changed and why.
108
+
109
+ ## test
110
+
111
+ Run the unit test suite. This step is deterministic: the command's exit code
112
+ decides whether the run continues.
113
+
114
+ ## report
115
+
116
+ Summarize the fix and the test results attached to this unit.
117
+ ```
118
+
119
+ What this buys you:
120
+
121
+ - **The suite is the gate.** `test` uses the default `on_error: fail`, so a
122
+ non-zero exit fails the unit with `non_zero_exit`, fails the step, and stops
123
+ the run before `report` ever dispatches. No judge, no rubric, no prompt — the
124
+ exit code is the verdict.
125
+ - **The output is real.** `steps.test.output` is the command's stdout (trailing
126
+ newlines stripped), so `report` receives the actual test output rather than a
127
+ model's recollection of it.
128
+ - **It costs nothing.** No tokens, no latency beyond the command itself, and the
129
+ same input always produces the same dispatch.
130
+ - **It resumes correctly.** A completed exec unit is journaled like any other; a
131
+ resumed run reuses the row instead of re-running the suite.
132
+
133
+ ### Getting a typed result instead of raw text
134
+
135
+ If the command can print JSON, declare an `output` schema on the unit and the
136
+ step artifact becomes a validated structure:
137
+
138
+ ```yaml
139
+ - id: test
140
+ unit:
141
+ exec:
142
+ command: ["bun", "run", "test:unit", "--reporter=json"]
143
+ output:
144
+ type: object
145
+ required: [passed, failed]
146
+ properties:
147
+ passed: { type: number }
148
+ failed: { type: number }
149
+ ```
150
+
151
+ stdout must then be **exactly one JSON value** — no log noise around it — and
152
+ downstream steps can address `steps.test.output.failed`.
153
+
154
+ ### What the command can see
155
+
156
+ The child does **not** inherit your environment. It starts empty and gets a
157
+ small default allowlist — `PATH`, `HOME`, the locale/temp/identity variables,
158
+ and the Windows essentials (`SystemRoot`, `COMSPEC`, `PATHEXT`, …) that
159
+ process creation itself needs — then your `env:` bindings, then the `AKM_*`
160
+ context variables. Ordinary commands (`bun`, `git`, `make`, `cargo`) work
161
+ unchanged; an unrelated `SOME_OTHER_SERVICE_TOKEN` sitting in the shell that
162
+ ran `akm workflow run` does not reach them.
163
+
164
+ Widen it only by naming what the unit needs:
165
+
166
+ ```yaml
167
+ - id: build
168
+ unit:
169
+ env: [env/build]
170
+ exec:
171
+ command: ["cargo", "build", "--release"]
172
+ pass_env: [CARGO_HOME, SCCACHE_DIR] # a few extra names
173
+ ```
174
+
175
+ `pass_env:` is for a **per-machine** variable an `env:` binding cannot express
176
+ (an env asset stores a committed value; `CARGO_HOME` differs per build agent).
177
+ Secrets and fixed values belong in exact named `env:` bindings: those values
178
+ are redacted out of everything journaled, and `pass_env:` values are not.
179
+
180
+ Workflow starts freeze the durable plan v4 family's current executable format
181
+ (`irVersion: 5`), which rejects `inherit_env` instead of persisting an
182
+ unbounded ambient environment. Pre-`irVersion`-5 stored plans do not execute;
183
+ start a new run after updating the source.
184
+
185
+ Named bindings and `pass_env:` are part of the unit's input hash, so changing
186
+ either re-runs the command instead of reusing a row recorded under another
187
+ scope.
188
+
189
+ Full list of allowlisted names:
190
+ [Workflow Schema: The child's environment is an allowlist](../reference/workflow-schema.md#the-childs-environment-is-an-allowlist).
191
+
192
+ ### Things to get right
193
+
194
+ - **`command:` is an argv array, not a shell string.** `["bun", "run", "test"]`,
195
+ never `"bun run test"`. Nothing is shell-parsed, which is what makes it safe;
196
+ if you truly need a pipeline, write `["bash", "-lc", "a | b"]` and own that
197
+ choice explicitly.
198
+ - **No interpolation.** The argv is frozen. A `map` step's item reaches the
199
+ command as `AKM_ITEM` (canonical JSON) and the run params as `AKM_PARAMS` —
200
+ read them from the environment, do not try to splice them into `command:`.
201
+ - **Secrets go in `env:`, never in `command:`.** `command:` is stored verbatim in
202
+ the frozen plan; `env:` bindings are carried by name and their values are
203
+ redacted out of everything journaled.
204
+ - **Long commands need a `timeout:`.** An exec unit defaults to 10 minutes. Use
205
+ `timeout: "30m"` for a slow suite, or `timeout: "none"` only when you really
206
+ mean unbounded.
207
+ - **Don't assume your shell's environment.** The child gets an allowlist, not
208
+ an inheritance. If a command fails with "not found" or reads a missing
209
+ toolchain variable, name it in `pass_env:`; use a named `env:` binding for a
210
+ fixed or secret value. The durable v4 family (`irVersion: 5`) deliberately
211
+ has no whole-process fallback.
212
+ - **A very chatty command still passes; its artifact just says so.** akm retains
213
+ 8 MiB of stdout and 8 MiB of stderr. Past that it keeps draining and discards,
214
+ so the command runs to completion and its exit code decides the step. The
215
+ artifact is then the retained head with a `__akm_exec_output_truncated__` block
216
+ appended, so nothing downstream can mistake it for the whole output. The one
217
+ case that still *fails* is a unit with a declared `output:` schema — a
218
+ truncated prefix is not one JSON value, so there is nothing to validate.
219
+ - **Bulk data reaches a command as a path, not as an environment variable.**
220
+ `AKM_INPUTS` / `AKM_PARAMS` / `AKM_ITEM` are bounded by what *process creation*
221
+ accepts on the current platform (96 KiB per variable on Linux/macOS, 32 767
222
+ bytes on Windows). Over that, the unit fails `exec_context_too_large` before
223
+ anything is spawned. If a workflow must also run on Windows, keep context under
224
+ the Windows number — akm will not enforce it on your Linux box, but a Windows
225
+ runner will.
226
+
227
+ Full reference: [Workflow Schema: Exec (shell) units](../reference/workflow-schema.md#exec-shell-units).
228
+
229
+ ## Common authoring mistakes
230
+
231
+ - **Templating prose.** There is no `${{ … }}`/`{{ … }}` interpolation
232
+ anywhere in a workflow body. Write instructions in plain language that
233
+ refer to attached context — "using the intake step's artifact attached to
234
+ this unit" — never by splicing a value into the string. See
235
+ [Workflow Schema: The reference grammar](../reference/workflow-schema.md#the-reference-grammar).
236
+ - **Mismatched or missing step headings.** Every `## <step-id>` must match a
237
+ step declared in frontmatter exactly — no titles, no `Step:`/`Step ID:`
238
+ lines, no `# Workflow:` prefix on the H1.
239
+ - **A `unit`/`map` step with no body section.** Its instructions (or, for a
240
+ map step, its per-item template) are required — a `route`-only step is the
241
+ one case a body section is optional.
242
+ - **Misplaced or misspelled `### gate`.** It is the format's single reserved
243
+ marker, and it must be a `###` sub-heading inside the step's own section.
244
+ An empty `### gate` section is the same as omitting it — no verification
245
+ runs.
246
+ - **Referencing an item outside a map unit.** `item`/`item_index` are not
247
+ part of the reference language anywhere — they only arrive as attached
248
+ context inside that map step's own unit template.
249
+ - **Backward routes.** Every `route` target (`when.step`, `default`) must be
250
+ a step declared *later* in the workflow; "loop back until it passes" is a
251
+ bounded `### gate` on the step doing the work, not a route back to an
252
+ earlier step.
253
+ - **Referencing an unknown step or param.** `akm lint --type workflows`
254
+ checks every bare reference statically (unknown step, unknown param, bad
255
+ path) — run it before you rely on a workflow working.
256
+ - **Writing `exec.command` as a shell string.** `command: "bun run test"` is
257
+ rejected; it must be an argv array (`["bun", "run", "test"]`). Nothing is
258
+ ever shell-parsed, so metacharacters inside an argument stay literal.
259
+ - **Expecting an exec command to inherit your environment.** It gets a default
260
+ allowlist (`PATH`, `HOME`, locale/temp/identity, the Windows essentials) plus
261
+ your `env:` bindings and the `AKM_*` context — nothing else. Widen it with
262
+ `exec.pass_env:` (a few non-secret names). `pass_env` lives inside `exec:`;
263
+ the unit-level `env:` key is a list of exact env asset binding refs. A new v4
264
+ start rejects `inherit_env`.
265
+ - **Asking a model to do deterministic work.** "Run the test suite and tell me
266
+ if it passed" is an [exec step](#deterministic-steps-run-a-command-gate-on-it),
267
+ not a prompt.
268
+
269
+ ## Typing what a step returns
270
+
271
+ A step's `output:` (and each `params:` entry) is a JSON Schema, and the engine
272
+ validates the step's artifact against it before the step can complete. The
273
+ runtime enforces a **bounded subset** of JSON Schema — anything outside it is
274
+ an authoring error at `akm lint`, never a silent no-op, because a gate
275
+ depending on a schema that constrains nothing is worse than a loud failure.
276
+
277
+ Enforced: `type`, `enum`, `properties`, `required`, `items`,
278
+ `additionalProperties: false`, `minItems`, `maxItems`, `minLength`,
279
+ `maxLength`, `minimum`, `maximum`, and the combinators `allOf`, `anyOf`,
280
+ `oneOf`, `not`.
281
+
282
+ ```yaml
283
+ - id: release
284
+ output:
285
+ type: object
286
+ required: [version, verdict]
287
+ additionalProperties: false
288
+ properties:
289
+ version: { type: string, minLength: 1 }
290
+ verdict: { type: string, enum: [pass, fail] }
291
+ detail:
292
+ oneOf:
293
+ - { type: string, minLength: 1 }
294
+ - { type: "null" }
295
+ ```
296
+
297
+ Outside the subset (each fails lint with the keyword named, its line, and a
298
+ suggested replacement where one exists): `$ref`/`$defs` — inline the schema
299
+ instead, since nothing resolves references; `const` — use a single-value
300
+ `enum`; `pattern` and `format` — no regex or string-format constraint is
301
+ evaluated at run time, so list the allowed values with `enum` when you can,
302
+ bound the size with `minLength`/`maxLength`, and otherwise check the shape in
303
+ the step's `### gate` rubric, which can also say *why* a value is wrong;
304
+ `patternProperties`, `if`/`then`/`else`, `uniqueItems`, `multipleOf`,
305
+ tuple-form `items`, and schema-form `additionalProperties` (only
306
+ `additionalProperties: false` is enforced). Annotation keywords —
307
+ `description`, `title`, `default`, `examples` — always pass through untouched,
308
+ and documenting each property is worth the keystrokes.
309
+
310
+ If lint reports a very broken workflow, note that its errors are sorted by
311
+ line, so fix from the top and re-run — the later ones are usually fallout from
312
+ the first.
313
+
314
+ ## Choosing engines and models
315
+
316
+ Set `defaults.engine`/`defaults.model` (or per-unit `unit.engine`/`unit.model`)
317
+ rather than hardcoding an exact model id, so the workflow stays
318
+ harness-agnostic. Reference semantic aliases — `fast`, `balanced`, `reasoning`,
319
+ or aliases defined in the installed/user `models.json` files — in `model:` fields; see
320
+ [Workflow Schema: Model references](../reference/workflow-schema.md#model-references)
321
+ for the exact resolution order and config shape.
322
+
323
+ Point `reasoning` work at a capable model and keep high-volume fan-out units
324
+ on `fast`/`balanced`. The richer example's `review` map step is a good template: `reasoning` on the
325
+ per-item reviewer, `balanced` as the run default for everything else.
326
+
327
+ ## Fan-out width
328
+
329
+ **A `map` step runs its items in parallel by default — 4 at a time as of
330
+ 0.9.1.** (Earlier versions defaulted to 1, so a fan-out over 500 items crawled
331
+ through them one by one unless you said otherwise.) Map units are independent
332
+ by construction, so parallel is the honest default; the number is a modest 4
333
+ rather than "whatever the machine can take" so it stays predictable across the
334
+ machines a workflow gets shared with.
335
+
336
+ Say so explicitly when the default is wrong for a step:
337
+
338
+ ```yaml
339
+ - id: review
340
+ map:
341
+ over: steps.discover.output.files
342
+ concurrency: 1 # serial — this step's units are NOT independent
343
+ ```
344
+
345
+ `concurrency: 1` is a genuine opt-out and always wins. Reach for it when the
346
+ units touch a shared resource, when their side effects must happen in list
347
+ order, or when they hit an external service you must not burst. To change the
348
+ default for every workflow on a machine instead — including restoring the old
349
+ serial behavior wholesale — set
350
+ `akm config set workflow.defaultMapConcurrency 1`.
351
+
352
+ The declared width is a **ceiling, not a promise**. Three other limits clamp it
353
+ and the smallest wins: `workflow.maxConcurrency`, the selected engine's
354
+ `engines.<name>.concurrency`, and the host's CPU cap. The engine limit is the
355
+ one that surprises people: an LLM engine pointed at **localhost defaults to 1**,
356
+ because local model servers hold a single loaded model and fall over under
357
+ concurrent requests — so a `map` against a local model stays serial no matter
358
+ what the step declares, until you raise that engine's own `concurrency`. Remote
359
+ LLM endpoints default to 4. See
360
+ [Workflow Schema: Fan-out and concurrency](../reference/workflow-schema.md#fan-out-and-concurrency)
361
+ for the full table.
362
+
363
+ All of it is frozen into the run when it starts, so an in-flight or resumed run
364
+ keeps the widths it began with even if you edit config or upgrade akm.
365
+
366
+ A workflow that fans out is authorizing **N parallel agents**, not one — the
367
+ same trust model described in
368
+ [Running Workflows: workflow sources are executed code](run-workflows.md#security-workflow-sources-are-executed-code)
369
+ applies with multiplied blast radius. Give the workflow explicit safety and
370
+ parameter metadata (document every `params` entry, keep destructive steps
371
+ described plainly in the body) so a reader — human or agent — can judge that
372
+ blast radius before running it.
373
+
374
+ ## Verify before you publish
375
+
376
+ 1. **Lint the structure.**
377
+
378
+ ```sh
379
+ akm lint --type workflows
380
+ ```
381
+
382
+ This catches the body-rule violations above, plus every static reference
383
+ check (unknown step, unknown param, bad path, backward route).
384
+
385
+ 2. **Run it for real.** A dry inspection of the markdown doesn't tell you
386
+ whether a gate actually rejects bad output or an `output` schema actually
387
+ matches what units return. Run the workflow against representative
388
+ params:
389
+
390
+ ```sh
391
+ akm workflow run workflows/my-release --version 1.2.3
392
+ ```
393
+
394
+ 3. **Inspect the evidence.** Check that each step's promoted artifact is
395
+ what you expect, and that a gate's rubric is judging that artifact, not
396
+ engine prose:
397
+
398
+ ```sh
399
+ akm workflow status <run-id> --units
400
+ ```
401
+
402
+ `--units` shows per-unit diagnostics (status, `failure_reason`, raw
403
+ result/error text) without polluting the deterministic artifact a gate
404
+ judges — see
405
+ [Running Workflows: Check status](run-workflows.md#check-status).
406
+
407
+ 4. **Deliberately break a gate once.** Run the workflow with params you
408
+ expect to fail validation, and confirm the gate actually rejects rather
409
+ than silently passing — a missing `workflow.judgeEngine` or a malformed
410
+ verdict rejects the gate rather than bypassing it (see
411
+ [Workflow Schema: Gates and verification](../reference/workflow-schema.md#gates-and-verification)),
412
+ so this is worth confirming once per workflow rather than assuming.
413
+
414
+ ## Running a child workflow (Experimental)
415
+
416
+ A step can run another workflow and use its result. The step names the child
417
+ in its `unit:` bag and binds the child's `params:` with `with:`:
418
+
419
+ ```markdown
420
+ ---
421
+ type: workflow
422
+ params:
423
+ topic: { type: string }
424
+ steps:
425
+ - id: investigate
426
+ unit:
427
+ workflow: workflows/research
428
+ with:
429
+ topic: { from: params.topic }
430
+ - id: report
431
+ inputs: [steps.investigate.output]
432
+ ---
433
+
434
+ ## investigate
435
+
436
+ Runs the research workflow as a child run.
437
+
438
+ ## report
439
+
440
+ Summarise the research finding.
441
+ ```
442
+
443
+ A `with:` value is a literal (checked against the child's param type when the
444
+ workflow is frozen) or `{ from: <reference> }`, where the reference is
445
+ `params.<name>` or `steps.<id>.output(.<segment>)*`, resolved just before the
446
+ step runs. The child's **last step output** is the composing step's output, so
447
+ `report` reads it through `inputs:`. Inspect what a step would pass, without
448
+ running anything, with `akm workflow plan workflows/<name> --format json`; the
449
+ per-step `inputBindings` show each literal and each unresolved reference.
450
+
451
+ Child workflows are Experimental. See
452
+ [Workflow Schema: Child workflows](../reference/workflow-schema.md#child-workflows)
453
+ for blocked-child recovery and the limits.
454
+
455
+ ## Troubleshooting
456
+
457
+ **Every workflow run needs a selected engine.** Freezing resolves an engine
458
+ for each unit. With no `defaults.engine`, akm falls back to a config-free
459
+ `opencode-sdk` engine — provider, model, and auth come from opencode's own
460
+ configuration — and announces it once in the run's `warnings`. The fallback
461
+ needs the **`opencode` binary on PATH**: the bundled `@opencode-ai/sdk`
462
+ package is an HTTP client only and spawns `opencode serve` to have something
463
+ to talk to, so installing the npm package alone is not enough. With no
464
+ binary, freezing fails with `INVALID_CONFIG_FILE` and exit 78.
465
+
466
+ A workflow with a non-empty `### gate` additionally requires
467
+ `workflow.judgeEngine` to name a configured LLM or agent engine — the gate
468
+ judge is not covered by the fallback.
469
+
470
+ `akm setup` normally selects a default execution engine. On a bare container
471
+ or CI image, either install opencode and let the fallback apply, or choose an
472
+ engine explicitly:
473
+
474
+ ```sh
475
+ npm i -g opencode-ai # fallback route: puts `opencode` on PATH
476
+ # ...or pick an engine yourself:
477
+ akm config set engines.claude '{"kind":"agent","platform":"claude"}'
478
+ akm config set defaults.engine claude
479
+ ```
480
+
481
+ ## See also
482
+
483
+ - [Workflow Schema](../reference/workflow-schema.md) — exact frontmatter,
484
+ refs, gates, and outputs syntax
485
+ - [Running Workflows](run-workflows.md) — start, inspect, resume, and abandon
486
+ a run
487
+ - [Architecture: The Workflow Engine](../architecture/workflow-engine.md) —
488
+ persistence, dispatch, and resume internals
489
+ - [CLI Reference](../reference/cli.md) — full flag documentation for
490
+ `workflow create`, `run`, and `lint`